假设您有一个函数,它调用两个独立的工作负载 doSomeWork
和 doMoreWork
。这两个函数都可能抛出同类型的错误,但您需要以不同的方式处理它们。
捕获错误并使用额外的上下文信息重新抛出错误是解决此问题的常用方法,例如
function doWork() {
try {
doSomeWork();
} catch (err) {
throw new CustomError('Some work failed', err);
}
doMoreWork();
}
try {
doWork();
} catch (err) {
// Is |err| coming from |doSomeWork| or |doMoreWork|?
}
不幸的是,上述解决方案很繁琐,因为需要创建自己的 CustomError
。更糟糕的是,没有开发工具能够为意外异常提供有用的诊断消息,因为没有关于如何正确表示这些错误的共识。
到目前为止,一直缺少的是一种标准的错误链方法。JavaScript 现在支持错误原因。可以在 Error
构造函数中添加一个额外的选项参数,其中包含一个 cause
属性,该属性的值将被分配给错误实例。然后可以轻松地将错误链接起来。
function doWork() {
try {
doSomeWork();
} catch (err) {
throw new Error('Some work failed', { cause: err });
}
try {
doMoreWork();
} catch (err) {
throw new Error('More work failed', { cause: err });
}
}
try {
doWork();
} catch (err) {
switch(err.message) {
case 'Some work failed':
handleSomeWorkFailure(err.cause);
break;
case 'More work failed':
handleMoreWorkFailure(err.cause);
break;
}
}
此功能在 V8 v9.3 中可用。
错误原因支持 #
- Chrome: 从版本 93 开始支持
- Firefox: 从版本 91 开始支持
- Safari: 从版本 15 开始支持
- Node.js: 不支持
- Babel: 不支持