Исключения (throw,try,catch,finally)
Может мне кто-нибудь рассказать про throw, try, catch, finally? После прочтения в книге осталось больше вопросов чем ответов.
Точнее не понятно 2 пункта. 1. Если есть вложенные исключения и инструкции обработки их как выполняется поиск. 2. Зачем try если исключение можно бросить и не в нём |
try..catch читал?
|
Да.
Там нету вложенных инструкций. |
Цитата:
Цитата:
function err(e){throw e} a = prompt('Введите "ошибка" или "еще ошибка"'); try { try { err(a) } catch (e){ if (e=='ошибка') alert('поймали ошибку'); else throw e} } catch (e){ if (e=='еще ошибка') alert('поймали ЕЩЕ ошибку'); else throw e} |
Какой-то странный у вас пример.
alert не показывает 'поймали ошибку' а какие-то многа букаф на англ. которые нельзя копи\паст Я требую рабочий пример:D |
а ща ?
|
Вроде нормально)
Хорошая пища для ума на завтра. Спасибо. |
function err(e){throw e} a = prompt('Введите "ошибка"'); try { try { err(a); } finally{ alert("Финалли"); } } catch (e) { if (e=='ошибка') alert('детектед ошибка'); } Почему тут срабатывает внешний catch? |
Цитата:
|
А что нельзя сделать чтобы сработал finally и всё?
Ведь вроде как catch не обязателен если стоит finally. |
Ловят ошибки только catch. Если нет ни одного catch, то доходит до window.onerror.
|
Ясно. А при каких ошибка JS сам генерирует throw?
|
|
Спасибо
|
А вот еще с таким сталкивался. В IE бросается исключение при попытке задать неправильный стиль. Это к какому типу ошибок относится?
try { document.body.style.height = "fgdfg"; } catch(e) { alert(e); } |
e.name выдаёт TypeError
|
Пишет просто Error
|
<html> <head> <meta charset="utf-8"> </head> <script> try { document.body.style.height = "fgdfg"; } catch(e) { alert(e.name); } </script> </html> Проверте P.S. Я проверял в мозиле TypeError-Переменная или параметр неправильного типа |
В фф ошибка не генерируется.
В IE генерируется. При этом e.name="Error" P.S. try { document.body.style.height = "fgdfg"; } catch(e) { alert(e); // У меня на странице выдает тоже, что и alert(e.name+": "+e.message); // А на форуме выдает [object Error] } |
Я вам токо что код привёл. У меня в фф выдаёт TypeError я не знаю как вы проверяете.
Версия фф-3.5.7 |
ФФ выдает ошибку потому, что у вас еще не создан объект body.
|
вы такое в мозиле проверьте
<html> <head> <meta charset="utf-8"> </head> <body> <script> try { document.body.style.height = "fgdfg"; } catch(e) { alert(e.name); } </script> </body> </html> Никакой ошибки. |
Через instanceof
try { document.body.style.height = "fgdfg"; } catch(e) { alert(e instanceof TypeError); // flase alert(e instanceof Error); // true } |
В хроме ваши примеры не запускаются=)
Значит проверяйте на все типы. |
Что значит не запускаются? Там, как и в фф не генерируется ошибка.
|
Те примеры что вы на форуме приводите по кнопке Запустить! не запускаются
это просто так к сведенью |
Niar,
Что вы называете "запускаются"? Если вы подразумеваете, что ничего не происходит, никаких алертов не выскакивает, то вы правы отчасти. В нормальных браузерах действительно при этих действиях никаких ошибок не генерируется (ничего не происходит). Но вот IE другое дело. Он генерирует ошибку при попытке назначить невалидный стиль DOM элементу. P.S. Кстати не обязательно через style. element.align = "ggg" // В IE также генерирует ошибку. |
вы проверили через instanceof все типы ошибок?
|
проверил, которые знал: EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError.
Ни один не подошел. Может есть еще типы, которые я забыл? |
Может это просто Error?
Вы всё проверили Или у ИЕ может свои типы есть |
Интересный момент что catch ловит только RangeError
|
Да. похоже, что это просто Error.
Ведь можно самому сделать trow new Error(). На свои типы у IE не похоже, поскольку e.name="Error". Будь это спец тип, я думаю, было бы не просто Error. |
Цитата:
|
то есть только ReferenceError
Вот например при SyntaxError даже если она сделана в try и есть catch то всё равно программа прерывается То есть не если искусственно new SyntaxError а если реально синтакс. ошибку допустить. |
Если прямо в странице допущена синтактическая ошибка, то действительно код не исполняется. А вот если синтаксическую ошибку допустить в eval, то ошибка ловится как положено.
Все остальные ошибки вроде нормально ловятся. |
Ловятся только ошибки времени то есть ReferenceError
Кстати на сайте статьи про типы объекта Error написаны убого. Ни одного примера одна-две строки и всё. |
Немного надо дополнить последний пост.
Такой код вообще не будет исполнен: try { a->(1); // синтактическая ошибка } catch(e) { alert(e) } Такой код будет исполнен. Код внутри eval исполнен не будет. При этом будет поймана SyntaxError. try { eval("a->(1);"); // синтактическая ошибка } catch(e) { alert(e) } Такой код будет исполнен. Код внутри eval исполнен не будет, в том числе и внутренний try..catch. При этом будет поймана SyntaxError во внешнем catch. try { eval("try { a->(1); } catch (err) { alert(err) } finally { alert('finally'); }"); } catch(e) { alert(e) } И finally тоже исполнен в последнем примере не будет. |
Цитата:
try { new Array(-10); } catch(e) { alert(e); // Ошибка RangeError } |
try { var str = "ggg"; str(); } catch(e) { alert(e); // TypeError } |
Значит Дэвид опять соврал:D
про eval http://javascript.ru/EvalError |
Часовой пояс GMT +3, время: 18:17. |