如何在JavaScript中链接exception(即像在java中添加原因)

有没有一个标准/最佳做法的方式来添加一个exception的原因在JavaScript中。 在Java中,你可能会这样做:

Throwable t = new Exception("whatever"); t.addCause(previouslyCaughtException); throw t; 

当打印产生的exception时,它会给你一个很好的跟踪,包括原因。 有没有什么好的方法来做到这一点的JavaScript或我必须推出自己的?

在prod中,我们使用TraceError

用法

 import TraceError from 'trace-error'; global.TraceError = TraceError; // expose globally (optional) throw new TraceError('Could not set status', srcError, ...otherErrors); 

产量

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

 ... } catch(e) { throw new Error("My error message: "+e.stack+"\n -----------") } 

我打印exception的方式使它看起来很干净,很干净。

 console.log("An exception! "+e.stack) 

打印这样的东西:

 My error message: <msg> <some line> <more lines> --------------- <some line> <more lines> 

如果表示“原因”,那么该行可能会更好,因为首先打印导致错误的exception的堆栈跟踪。

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

Joyent也有一个页面讨论Node.jserror handling的最佳实践https://www.joyent.com/developers/node/design/errors

唯一的是我不喜欢如果你传递一个null或未定义的参数,Joyent的VError实现如何落空。 当你处理错误时,这一点尤为重要,因为它只会掩盖问题的根本原因。 我已经分叉他们的VError,所以它不会失败,参数为空或未定义。 https://github.com/naddison36/node-verror

你可以链接错误对象Errorstackmessage

 var console = { log: function(s) { document.getElementById("console").innerHTML += s + "<br/>" } } var error1=new Error("This is error 1"); console.log("Message: ".concat( error1.message )); console.log("Stack<br>".concat(error1.stack) ); var error2=new Error("This is error 2"); console.log("Message: ".concat( error2.message) ); console.log("Stack<br>".concat( error2.stack) ); var error3=new Error("This is error 3"); error3.stack=error3.stack.concat(error2.stack).concat(error1.stack) console.log("Message: ".concat(error3.message)); console.log("Stack<br>".concat(error3.stack)); 
 <div id="console" />