解决方法
与其他语言(如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); } }
"TypeError: Object #<Object> has no method 'nonexistingMethod'" // with error.arguments === ['nonexistingMethod',o]
"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