使用coffeescript / javascript’throw error’或’throw new Error(error)’?

前端之家收集整理的这篇文章主要介绍了使用coffeescript / javascript’throw error’或’throw new Error(error)’?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下coffeescript代码
try
   do something
catch error
   log something
   throw error

我应该使用抛出新的错误(错误)而不是抛出错误

有什么不同?

解决方法

与其他语言(如C#或Java)相同:

抛出错误抛出相同的Error对象
抛出新的错误(错误)包装到一个新的错误对象.当您需要将checked 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);
    }
}

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

"TypeError: Object #<Object> has no method 'nonexistingMethod'"
// with error.arguments === ['nonexistingMethod',o]

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

"Error: TypeError: Object #<Object> has no method 'nonexistingMethod'"
//  with error.arguments === undefined

所以,通过使用包装错误对象可以看出,我们可以隐藏原始错误的参数.假设您正在写下列之一:

>某种图书馆
>一个脚本,它将被加载到你不拥有的页面上(例如,某种类似或者tweet按钮)
>页面上的脚本,其中载入了一些第三方脚本(社交按钮,广告,跟踪代码等)

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

编辑2:关于堆栈跟踪.两种变体保留它们.这是a working example,我在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

猜你在找的JavaScript相关文章