1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-26 16:09:27 -05:00

fix(core): handle unregistered errors in core better (#7817)

This commit is contained in:
Kitson Kelly 2020-10-05 20:35:51 +11:00 committed by GitHub
parent 8d00c32ee2
commit f632b3b6e7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 16 deletions

View file

@ -50,7 +50,13 @@
function unwrapResponse(res) { function unwrapResponse(res) {
if (res.err != null) { if (res.err != null) {
throw new (core.getErrorClass(res.err.className))(res.err.message); const ErrorClass = core.getErrorClass(res.err.className);
if (!ErrorClass) {
throw new Error(
`Unregistered error class: "${res.err.className}"\n ${res.err.message}\n Classes of errors returned from ops should be registered via Deno.core.registerErrorClass().`,
);
}
throw new ErrorClass(res.err.message);
} }
return res.result; return res.result;
} }

View file

@ -196,9 +196,7 @@ SharedQueue Binary Layout
} }
function getErrorClass(errorName) { function getErrorClass(errorName) {
const className = errorMap[errorName]; return errorMap[errorName];
assert(className);
return className;
} }
// Returns Uint8Array // Returns Uint8Array
@ -215,6 +213,20 @@ SharedQueue Binary Layout
let nextPromiseId = 1; let nextPromiseId = 1;
const promiseTable = {}; const promiseTable = {};
function processResponse(res) {
if ("ok" in res) {
return res.ok;
} else {
const ErrorClass = getErrorClass(res.err.className);
if (!ErrorClass) {
throw new Error(
`Unregistered error class: "${res.err.className}"\n ${res.err.message}\n Classes of errors returned from ops should be registered via Deno.core.registerErrorClass().`,
);
}
throw new ErrorClass(res.err.message);
}
}
async function jsonOpAsync(opName, args = {}, ...zeroCopy) { async function jsonOpAsync(opName, args = {}, ...zeroCopy) {
setAsyncHandler(opsCache[opName], jsonOpAsyncHandler); setAsyncHandler(opsCache[opName], jsonOpAsyncHandler);
@ -229,23 +241,13 @@ SharedQueue Binary Layout
promise.resolve = resolve; promise.resolve = resolve;
promise.reject = reject; promise.reject = reject;
promiseTable[args.promiseId] = promise; promiseTable[args.promiseId] = promise;
const res = await promise; return processResponse(await promise);
if ("ok" in res) {
return res.ok;
} else {
throw new (getErrorClass(res.err.className))(res.err.message);
}
} }
function jsonOpSync(opName, args = {}, ...zeroCopy) { function jsonOpSync(opName, args = {}, ...zeroCopy) {
const argsBuf = encodeJson(args); const argsBuf = encodeJson(args);
const res = dispatch(opName, argsBuf, ...zeroCopy); const res = dispatch(opName, argsBuf, ...zeroCopy);
const r = decodeJson(res); return processResponse(decodeJson(res));
if ("ok" in r) {
return r.ok;
} else {
throw new (getErrorClass(r.err.className))(r.err.message);
}
} }
function jsonOpAsyncHandler(buf) { function jsonOpAsyncHandler(buf) {