像很多时髦的语言一样,JavaScript也允许抛出异常,随后再用一个try/catch语句块捕获。如果抛出的异常未被捕获,大多数JavaScript环境都会提供一个有用的堆栈轨迹。举个例子,下面这段代码由于'{'为无效JSON对象而抛出异常。 EventModel/stackTrace.js function JSONToObject(jsonStr) { return JSON.parse(jsonStr); } var obj = JSONToObject('{'); SyntaxError: Unexpected end of input at Object.parse (native) at JSONToObject (/AsyncJS/stackTrace.js:2:15) at Object.<anonymous> (/AsyncJS/stackTrace.js:4:11) 堆栈轨迹不仅告诉我们哪里抛出了错误,而且说明了最初出错的地方:第4行代码。遗憾的是,自顶向下地跟踪异步错误起源并不都这么直截了当。在本节中,我们会看到为什么throw很少用作回调内错误处理的正确工具,还会了解如何设计异步API以绕开这一局限。