Не останавливайте JavaScript, когда он выдает исключение

Я пишу гаджет Windows Sidebar с помощью 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.");

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

Спасибо.

Ответ 1

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

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;

Дополнительная информация здесь

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

  • Ловля исключения - это форма управления потоком. Вы не хотели бы испортить свои for-loops, правильно?

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

Поэтому лучшее, что вы можете надеяться достичь, - это посмотреть, какие исключения у вас есть, и настроить свою отладку на него. Есть ли у вас проблемы с элементами, которые не найдены, в качестве исходного примера? Затем добавьте тест для null перед использованием node:

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

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

Ответ 5

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

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

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