JavaScript中的内部错误(异常)

Inner Errors (exceptions) in JavaScript

本文关键字:异常 错误 内部 JavaScript      更新时间:2023-09-26

在JavaScript中抛出异常时,是否有包含内部异常的首选方法?

我对来自C#背景的JavaScript还比较陌生。在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、属性为textinternal_exception的错误。

Error.cause属性中可能存在内部错误。您可以通过Error构造函数的options参数提供一个。示例:

try {
  divide(dividend, divisor);
} catch (err) {
  throw new Error(`Devision by ${divisor} failed. See cause for details.`, { cause: err });
}

当抛出并打印这样的错误时,它会像您所期望的那样反复显示内部错误。在ts-node REPL中运行throw new Error("Outer", { cause: new Error("Inner") });会产生:

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