2012-06-11 6 views

ответ

16

же, как и в других языках, таких как 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 
+0

Кто-то посоветовал мне, что завернуты версия дает объект ошибки с полным StackTrace, в противном случае вы получите только сообщение об ошибке. –

+0

Он утверждает, что вы получаете стек, потому что используете console.error(), если вы хотите передать объект ошибки где-то еще, вы их потеряете. Я склонен полагать, что они сохранились, но будет интересно исследовать это. –

+1

Это зависит от браузера. Например, в IE9 на объектах Error нет свойства 'stack'. Я не знаю о других браузерах. –

Смежные вопросы