же, как и в других языках, таких как C# или Java:
throw error
бросает один и тот же объект Error
throw new Error(error)
оборачивает его в новый объект Error. Более поздняя версия используется, например, на Java, когда вам нужно преобразовать checked Exception в непроверенный. В JavaScript вам не нужно обматывать исключения, поскольку это сделает stacktrace немного длиннее и менее красивым.
Редактировать: Есть некоторые последствия для безопасности. Вот пример:
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
Итак, как вы можете видеть, используя wrapping Объект ошибки мы можем скрыть ошибку arguments
. Предположим, что вы пишете одно из следующих действий:
- своего рода библиотеки
- скрипт, который будет загружен на страницу, на которой вы не владеете (например, какой-то, как или чириканье кнопки)
- скрипта на странице, которая имеет некоторые сторонние скрипты, загруженные (социальные кнопки, объявление, код отслеживания и т.д.)
во всех этих случаях, перечисленных выше, для того, чтобы оставаться безопасным вы должны обернуть вашError
объектов. В противном случае вы можете случайно протестировать ссылки на свои внутренние объекты, функции и переменные.
Редактировать 2: Относительно stacktraces. Оба варианта сохраняют их. Вот a working example и я получаю следующие stacktraces в 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
Кто-то посоветовал мне, что завернуты версия дает объект ошибки с полным StackTrace, в противном случае вы получите только сообщение об ошибке. –
Он утверждает, что вы получаете стек, потому что используете console.error(), если вы хотите передать объект ошибки где-то еще, вы их потеряете. Я склонен полагать, что они сохранились, но будет интересно исследовать это. –
Это зависит от браузера. Например, в IE9 на объектах Error нет свойства 'stack'. Я не знаю о других браузерах. –