Не останавливайте JavaScript, когда он выдает исключение - PullRequest
4 голосов
/ 29 июля 2011

Я пишу гаджет для боковой панели Windows, используя JavaScript.Теперь я хотел бы, чтобы все исключения JavaScript перехватывались и записывались в текстовый файл.Одна из проблем заключается в том, что при возникновении исключения в любой строке следующая строка не будет выполнена.Можно ли автоматически перехватывать исключения, чтобы можно было выполнить следующую строку JavaScript.

Вот пример кода, который демонстрирует мою проблему:

try
{
    alert(document.getElementById("non-existing-element").value);
}
catch(ex)
{
}
alert("This is shown.");
alert(document.getElementById("non-existing-element").value);
alert("This is not shown.");

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

Спасибо.

Ответы [ 5 ]

6 голосов
/ 29 июля 2011

Вместо того, чтобы пытаться отлавливать ошибки, вы должны пытаться создать правильную логику для их контроля.

var myEle = document.getElementById("non-existing-element")

if (myEle != null)
   alert(dmyEle.value);

Но вы описываете подавление ошибок

Вы можете подавить ошибку в JavaScript с помощью обработчика события onerror.

function handleErr(msg, url, line_no){ 
   var errorMsg = "Error: " + msg + "\n"; 
       errorMsg += "URL: " + url + "\n"; 
       errorMsg += "Line: " + line_no + "\n\n"; 

    alert(errorMsg); 

 return true;
} 

// Set the global onerror; 
onerror = handleErr;

Больше информации здесь

3 голосов
/ 29 июля 2011

Нет. Исключения всегда распространяются до ближайшего содержащего блока try, а затем выходят из блока try, если у него нет catch и finally нормально выходит.

В JavaScript нет возобновляемых исключений, поэтому нет способа объявить один глобальный обработчик исключений и возобновить все исключения.

2 голосов
/ 29 июля 2011

Не простое решение, но если вы используете что-то вроде jQuery и делаете

$("#non-existing-element").attr('value') 

, то было бы лучше, потому что attr реализован так, чтобы ничего не возвращать, когда не найдено ни одного элемента.Я верю, что у этой философии есть название, но я не могу об этом думать.

1 голос
/ 29 июля 2011

Предложенный вами метод "игнорировать исключения" будет работать только в том случае, если все ваши исключения являются необработанными и можно игнорировать.В общем случае это не так, поскольку

  1. Перехват исключения является формой управления потоком.Вы не хотели бы испортить ваши циклы for, верно?

  2. Код, следующий за строкой исключения, вполне может зависеть от того, правильно ли выполнена эта строка.(например, кто-то может захотеть использовать это .value)

Следовательно, лучшее, на что вы можете надеяться, - это увидеть, какие исключения вы в настоящее время имеете, и настроить отладку.к этому.У вас просто проблемы с элементами, которые не были найдены, как в первом примере?Затем добавьте тест на нулевое значение перед использованием узла:

var node = document.getElementById('id');
if(!node) { /* inexisting element!*/ }
console.log('I dont have to worry about', node.value, 'now');

Если ваши исключения происходят откуда-то еще, возможно, существует аналогичное решение.

0 голосов
/ 29 июля 2011

Вам нужно будет обернуть каждую часть в ловушку try ... catch.

Другая альтернатива - использовать jQuery, поскольку он не выдает исключений, когда элементы не найдены:

$('.non-existing-element').val();
...