Не останавливайте 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();