在 JavaScript 中抛出异常时是否有首选方法来包含内部异常?
我对 JavaScript 比较陌生,有 C# 背景。在 C# 中,您可以执行以下操作:
try
{
// Do stuff
}
catch (Exception ex)
{
throw new Exception("This is a more detailed message.", ex);
}
在我在 JavaScript 中看到的示例中,我无法找到如何捕获异常、添加新消息以及在仍传递原始异常的同时重新抛出新异常。
你可以扔任何你想要的物体:
try {
var x = 1/0;
}
catch (e) {
throw new MyException("There is no joy in Mudville", e);
}
function MyException(text, internal_exception) {
this.text = text;
this.internal_exception = internal_exception;
}
然后将抛出类型为
MyException
且具有属性 text
和 internal_exception
的错误。
Error.cause
属性中可能存在内部错误。您可以通过 options
构造函数的 Error
参数提供一个。示例:
try {
divide(dividend, divisor);
} catch (err) {
throw new Error(`Devision by ${divisor} failed. See cause for details.`, { cause: err });
}
当抛出并打印这样的错误时,它将递归地显示内部错误,正如您所期望的那样。在
throw new Error("Outer", { cause: new Error("Inner") });
REPL 中运行 ts-node
会产生:
Uncaught Error: Outer
at <repl>.ts:1:7
at Script.runInThisContext (node:vm:129:12)
... 7 lines matching cause stack trace ...
at bound (node:domain:433:15) {
[cause]: Error: Inner
at <repl>.ts:1:35
at Script.runInThisContext (node:vm:129:12)
at runInContext (/usr/local/lib/node_modules/ts-node/src/repl.ts:665:19)
at Object.execCommand (/usr/local/lib/node_modules/ts-node/src/repl.ts:631:28)
at /usr/local/lib/node_modules/ts-node/src/repl.ts:653:47
at Array.reduce (<anonymous>)
at appendCompileAndEvalInput (/usr/local/lib/node_modules/ts-node/src/repl.ts:653:23)
at evalCodeInternal (/usr/local/lib/node_modules/ts-node/src/repl.ts:221:12)
at REPLServer.nodeEval (/usr/local/lib/node_modules/ts-node/src/repl.ts:243:26)
at bound (node:domain:433:15)
请注意,将内部错误放入
cause
中只是一种约定(但这是一个很强的约定,如 ts-node
由于 7 lines matching cause stack trace
截断外部堆栈跟踪所示)。因此,任何东西都可能位于 cause
属性内,因此在使用之前请先检查一下! MDN 给出了一个在使用附加数据进行内部错误的示例之后放置附加数据的示例:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
{"error":{"description":"共享链接不再存在,或者您无权访问。","innerError":{"description":"共享链接不再存在,或者您无权访问它。"},"loggableMessage":{"_value":"共享链接不再存在,或者您无权访问它。","_type":"不安全","__isPrivacyDataWrapper ":true},"name":"GraphError","correlationId":"03a7dc71-fccb-43e2-892b-3bc496a33f49","isExpected":false,"code":"accessDenied","extraData":{"apiEventName ":"VroomDataRequest.item"},"response":{"error":{"code":"accessDenied","message":"共享链接不再存在,或者您无权访问它。" ,“innerError”:{“日期”:“2024-10-20T14:59:53”,“请求id”:“03a7dc71-fccb-43e2-892b-3bc496a33f49”,“客户端请求id”:“03a7dc71 -fccb-43e2-892b-3bc496a33f49"}}},"status":403,"serverStack":"","request":{},"error":{"description":"共享链接不再存在,或者您没有访问权限。"}}}