使用coffeescript/javascript'抛出错误'或'抛出新错误(错误)'?

Mih*_*rea 9 javascript error-handling coffeescript

我有以下coffeescript代码:

try
   do something
catch error
   log something
   throw error
Run Code Online (Sandbox Code Playgroud)

我应该用throw new Error(error)而不是throw error吗?

有什么不同?

And*_*кин 16

与C#或Java等其他语言相同:

  • throw error 抛出相同的Error对象
  • throw new Error(error)将其包装到一个新的Error对象中.例如,当您需要将已检查的Exception转换为未经检查的Exception时,后者将用于Java .在JavaScript中,您不需要包装异常,因为这会使堆栈跟踪更长一点,也不那么漂亮.

编辑:也有一些安全隐患.这是一个例子:

function noWrap() {
    try {
        var o = {}; o.nonexistingMethod();
    } catch (error) {
        throw error;
    }
}

function wrap() {
    try {
        var o = {}; o.nonexistingMethod();
    } catch (error) {
        throw new Error(error);
    }
}
Run Code Online (Sandbox Code Playgroud)

调用noWrap()产生以下错误消息:

"TypeError: Object #<Object> has no method 'nonexistingMethod'"
// with error.arguments === ['nonexistingMethod', o]
Run Code Online (Sandbox Code Playgroud)

调用wrap()产生以下错误消息:

"Error: TypeError: Object #<Object> has no method 'nonexistingMethod'"
//  with error.arguments === undefined
Run Code Online (Sandbox Code Playgroud)

因此,正如您可以通过使用包装Error对象看到的那样,我们可以隐藏arguments原始错误.假设您正在编写以下内容之一:

  • 某种图书馆
  • 将加载到您不拥有的页面上的脚本(例如,某种类似或推文按钮)
  • 页面上加载了某些第三方脚本的脚本(社交按钮,广告,跟踪代码等)

在上面列出的所有这些情况下,为了保持安全,您应该包装您的 Error 对象.否则,您可能会意外泄漏对内部对象,函数和变量的引用.

编辑2:关于堆栈跟踪.两种变体都保留它们.这是一个工作示例,我在Chrome中获得以下堆栈跟踪:

// No wrapping:
TypeError: Object #<Object> has no method 'nonexistingMethod'
    at noWrap (http://fiddle.jshell.net/listochkin/tJzCF/show/:22:23)
    at http://fiddle.jshell.net/listochkin/tJzCF/show/:37:5
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3901:62
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3915:20

// Wrapping:
Error: TypeError: Object #<Object> has no method 'nonexistingMethod'
    at wrap (http://fiddle.jshell.net/listochkin/tJzCF/show/:32:15)
    at http://fiddle.jshell.net/listochkin/tJzCF/show/:44:5
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3901:62
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3915:20 
Run Code Online (Sandbox Code Playgroud)