Есть ли какой-нибудь способ помешать Javascript молчать? - PullRequest
18 голосов
/ 15 октября 2010

Одна вещь, которая сводит меня с ума, это то, как Javascript молча терпит неудачу во многих различных ситуациях.

(удаленный пример, потому что это сбивает с толку вопрос моего вопроса)

Много раз я сталкивалсяошибка, которая выдает сообщение об ошибке при вводе в консоль Firebug, но когда она запускается внутри скрипта страницы, происходит сбой без предупреждения, даже при активной и открытой консоли Firebug!

Некоторыеиз этих проблем может быть обнаружен JsLint Крокфорда, но многие из них этого не сделают.

Нет ли способа включить больше сообщений об ошибках в браузере?

Можете ли вы сделать это вообще?без использования сред отладчика javascript?Я считаю, что отладчики мне мало помогают.Обычно я добавляю несколько операторов console.log () и могу найти проблему за минуту.Что сводит меня с ума, так это то, что тихие ошибки в Javascript могут оставаться незамеченными в течение длительного времени или обнаруживаться способами, которые вообще не очевидны.Это еще более расстраивает, потому что тестирование оператора в консоли выдает ошибку, так что происходит?

Кстати, у меня была такая же проблема с исключениями, кто-нибудь это замечал?Часто мои throw new заявления вообще не работают.Но если я наберу то же самое в консоли, то это произойдет.

Спасибо за ваши полезные комментарии (первые ответы), но это не мой вопрос.Эти тесты полезны, когда вам нужно очистить параметры класса, например, когда вы не знаете наверняка об окружающей среде.Вы не хотите проверять наличие свойств или классов, в которых вы ожидаете, что они будут там;это было бы вздутие кода без причины.

Ответы [ 4 ]

6 голосов
/ 15 октября 2010

Я думаю, что некоторые из ответов на этот вопрос неверно истолковывают вопрос.IIUC, вопрос состоит в том, что ошибка заключается в том, что подавляется, когда этот код запускается внутри реальной веб-страницы, но ОП не хочет, чтобы было.(Предположительно, в основном для целей отладки.)

Мой вопрос будет тогда, где этот код действительно работает в контексте веб-сайта?Скорее всего, что-то еще подавляет ошибку, прежде чем она до вас дойдет.Например, некоторые библиотеки могут инстинктивно подавлять ошибки, возникающие в определенных обратных вызовах (например, для XHR).Однако, если они хороши, они также имеют тенденцию предоставлять точку подключения для получения уведомления, если произошла ошибка.

5 голосов
/ 15 октября 2010

Приведенный ниже код перехватит все ошибки в блоке catch:

var a;
try {
    a = new Foo.Apple();
} catch (err) {
    // Error handling
}

Для получения дополнительной информации: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch

4 голосов
/ 15 октября 2010

Если вы работаете с объектами, для которых вы не уверены, существуют ли они во время выполнения или нет, вы должны проверить их наличие:

if (Foo && Foo.Apple) {
    // exists, do something with it
} else {
    // doesn't exist, do Plan B
}

Обратите внимание на выражение (Foo && Foo.Apple) сначала проверит, существует ли Foo, и только если он существует, он проверит, есть ли у него свойство с именем Apple.Если это так, то if-ветвь будет выполнена.

Если Foo не существует или не содержит свойства Apple, выполняется ветвь else.

3 голосов
/ 15 октября 2010

Согласитесь с @sime Vidas, если необходимо обработать исключение и не оставлять его без внимания, сначала используйте логическое условие и проверьте, существует ли значение.

if(Foo.Apple){
\\your code
}
else
{
//Foo.Apple does not exist, do some exception handling here
}
...