如何在javascript中链接异常(即在java中添加原因)

B T*_*B T 26 javascript java error-handling node.js

是否有标准/最佳实践方法在javascript中添加异常原因.在java中你可能会这样做:

Throwable t = new Exception("whatever");
t.addCause(previouslyCaughtException);
throw t;
Run Code Online (Sandbox Code Playgroud)

当打印出结果异常时,它会为您提供包含原因的精美跟踪.有什么好方法可以在javascript中执行此操作,还是我必须自己滚动?

Ita*_*ish 9

在 NodeJS 和浏览器中,现在这是可能的:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause

https://nodejs.org/api/errors.html#errorcause

try {
  aFunctionThatWillThrow()
} catch (err) {
  throw new Error('A function that will throw did throw!', { cause: err });
}
Run Code Online (Sandbox Code Playgroud)


B T*_*B T 7

现在(直到有更好的答案),这就是我所做的:

...
} catch(e) {
  throw new Error("My error message, caused by: "+e.stack+"\n ------The above causes:-----")
}
Run Code Online (Sandbox Code Playgroud)

我打印异常的方式使它看起来很漂亮和干净:

console.log(e.stack)
Run Code Online (Sandbox Code Playgroud)

打印这样的东西:

My error message: SomeError
<some line>
<more lines>
------The above causes:-----
<some line>
<more lines>
Run Code Online (Sandbox Code Playgroud)

如果它说"原因",那么该行可能会更好,因为首先打印导致错误的异常的堆栈跟踪.

  • 我建议添加原始错误的消息。不过还是谢谢你的提示! (3认同)
  • 我已经在e.stack中看到了原始的错误消息 (2认同)

nad*_*son 7

如果您使用的是Node.js,则可以使用VError

Joyent还有一个页面讨论Node.js中错误处理的最佳实践https://www.joyent.com/developers/node/design/errors

唯一的问题是,如果传入null或未定义的参数,我不喜欢Joyent的VError实现方式.当您处理错误时,这一点尤其重要,因为它只会掩盖问题的根本原因.我已经分叉了他们的VError,因此它不会因为null或undefined参数而失败. https://github.com/naddison36/node-verror


Mat*_*ian 6

在 prod 中,我们使用TraceError

用法

import TraceError from 'trace-error';

global.TraceError = TraceError; // expose globally (optional)

throw new TraceError('Could not set status', srcError, ...otherErrors);
Run Code Online (Sandbox Code Playgroud)

输出