Есть три типа ошибок в программировании:
Синтаксические ошибки, также называемые ошибками синтаксического анализа, происходят во время компиляции в традиционных языках программирования и в интерпретации времени в JavaScript.
Например, следующая строка вызывает ошибку синтаксиса, поскольку отсутствует закрывающая скобка.
<script type="text/javascript"> <!-- window.print(; //--> </script>
При возникновении синтаксической ошибки в JavaScript затрагивается только код, содержащийся в том же потоке, что и синтаксическая ошибка, а остальная часть кода в других потоках выполняется при условии, что он не зависит от кода, содержащего ошибку.
Ошибки времени выполнения, называемые также исключениями, происходят во время выполнения (после компиляции/интерпретации).
Например, следующая строка вызовет ошибку во время выполнения, поскольку здесь синтаксис является правильным, но во время выполнения, он пытается вызвать метод, который не существует.
<script type="text/javascript"> <!-- window.printme(); //--> </script>
Исключения также влияют на поток, в котором они происходят, позволяя другие потоки JavaScript, продолжить нормальное выполнение.
Логические ошибки могут быть наиболее сложным видом для отслеживания ошибок. Эти ошибки не являются результатом синтаксической ошибки или во время выполнения. Вместо этого, они возникают, когда вы допустили ошибку в логике, что приводит к сценарию, когда вы не получите результат, который вы ожидали.
Вы не можете поймать эти ошибки, потому что это зависит от ваших потребностей бизнеса, какой тип логики вы хотите поместить в вашей программе.
В последних версиях JavaScript добавлены возможности обработки исключений. JavaScript реализует try…catch…finally, а также оператор throw для обработки исключений.
Можно перехватить исключения, созданные программистом, и исключения среды выполнения, но нельзя перехватить ошибки синтаксиса JavaScript.
Вот блок синтаксиса try…catch…finally:
<script type="text/javascript"> <!-- try { // Выполняемый код [break;] } catch ( e ) { // Код для запуска при возникновении исключения [break;] } [ finally { // Код, который выполняется всегда, независимо от // возникающего исключение }] //--> </script>
За блоком try должен следовать либо ровно один блок catch, либо один блок finally (или один из обоих). При возникновении исключения в блоке try исключение помещается в e и выполняется блок catch. Необязательный блок finally выполняется безоговорочно после try/catch.
Вот пример, где мы пытаемся вызвать несуществующую функцию, которая, в свою очередь поднимает исключение. Давайте посмотрим, как ведет себя без Try … Catch:
<html> <head> <script type="text/javascript"> <!-- function myFunc() { var a = 100; alert("Значение переменной : " + a ); } //--> </script> </head> <body> <p>Нажмите ниже, чтобы увидеть результат:</p> <form> <input type="button" value="Кликни меня" onclick="myFunc();" /> </form> </body> </html>
Теперь давайте попробуем поймать это исключение с помощью Try … Catch и отобразим для пользователя сообщение. Вы также можете отключить это сообщение, если вы хотите, скрыть эту ошибку от пользователя.
<html> <head> <script type="text/javascript"> <!-- function myFunc() { var a = 100; try { alert("Значение переменной: " + a ); } catch ( e ) { alert("Ошибка: " + e.description ); } } //--> </script> </head> <body> <p>Нажмите ниже, чтобы увидеть результат:</p> <form> <input type="button" value="Нажмите меня" onclick="myFunc();" /> </form> </body> </html>
Вы можете использовать блок finally, который всегда будет выполняться безоговорочно после try/catch. Вот пример:
<html> <head> <script type="text/javascript"> <!-- function myFunc() { var a = 100; try { alert("Значение переменной : " + a ); } catch ( e ) { alert("Ошибка: " + e.description ); } finally { alert("Блок finally всегда будет выполняться!" ); } } //--> </script> </head> <body> <p>Нажмите ниже, чтобы увидеть результат:</p> <form> <input type="button" value="Кликни меня" onclick="myFunc();" /> </form> </body> </html>
Вы можете использовать заявление throw чтобы поднять встроенные исключения или настроенные исключения. Позже эти исключения могут быть захвачены и вы можете принять соответствующие меры.
В следующем примере показано, как использовать заявление throw.
<html> <head> <script type="text/javascript"> <!-- function myFunc() { var a = 100; var b = 0; try{ if ( b == 0 ){ throw( "Ошибка деления на ноль." ); } else { var c = a / b; } } catch ( e ) { alert("Ошибка: " + e ); } } //--> </script> </head> <body> <p>Нажмите ниже, чтобы увидеть результат:</p> <form> <input type="button" value="Кликни меня" onclick="myFunc();" /> </form> </body> </html>
Вы можете вызвать исключение в одной функции, используя строку, целое число, логическое значение, или объект, а затем вы можете захватить это исключение либо в одной и той же функции, как мы делали выше, или в другой функции с помощью блока Try … Catch.
Обработчик событий onerror был первой функцией, облегчающей обработку ошибок в JavaScript. Событие ошибки возникает на объекте окна всякий раз, когда на странице возникает исключение.
<html> <head> <script type="text/javascript"> <!-- window.onerror = function () { alert("Произошла ошибка."); } //--> </script> </head> <body> <p>Нажмите ниже, чтобы увидеть результат:</p> <form> <input type="button" value="Кликни меня" onclick="myFunc();" /> </form> </body> </html>
Обработчик событий OnError содержит три части информации, чтобы определить точный характер ошибки:
Вот пример, чтобы показать, как извлечь эту информацию.
<html> <head> <script type="text/javascript"> <!-- window.onerror = function (msg, url, line) { alert("Сообщение : " + msg ); alert("url : " + url ); alert("Номер строки : " + line ); } //--> </script> </head> <body> <p>Нажмите ниже, чтобы увидеть результат:</p> <form> <input type="button" value="Кликни меня" onclick="myFunc();" /> </form> </body> </html>
Вы можете отобразить извлеченную информацию любым способом, какой лучше.
Вы можете использовать метод OnError, как показано ниже, чтобы отобразить сообщение об ошибке в случае, если есть какие – либо проблемы при загрузке изображения.
<img src="andreyeximage.gif" onerror="alert('Произошла ошибка при загрузке изображения.')" />
Вы можете использовать OnError со многими HTML-тегами для отображения соответствующих сообщений в случае возникновения ошибок.