Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Исключения (throw,try,catch,finally) (https://javascript.ru/forum/misc/7326-isklyucheniya-throw-try-catch-finally.html)

Niar 26.01.2010 18:23

Исключения (throw,try,catch,finally)
 
Может мне кто-нибудь рассказать про throw, try, catch, finally? После прочтения в книге осталось больше вопросов чем ответов.
Точнее не понятно 2 пункта.
1. Если есть вложенные исключения и инструкции обработки их как выполняется поиск.
2. Зачем try если исключение можно бросить и не в нём

PeaceCoder 26.01.2010 18:50

try..catch читал?

Niar 26.01.2010 18:52

Да.
Там нету вложенных инструкций.

PeaceCoder 26.01.2010 18:58

Цитата:

1. Если есть вложенные исключения и инструкции обработки их как выполняется поиск.
гдето читал что последовательно и по глубине
Цитата:

Сообщение от Niar
2. Зачем try если исключение можно бросить и не в нём

try нужен что бы скрипт не остановился при ошибке.
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}

Niar 26.01.2010 19:02

Какой-то странный у вас пример.
alert не показывает 'поймали ошибку' а какие-то многа букаф на англ. которые нельзя копи\паст
Я требую рабочий пример:D

PeaceCoder 26.01.2010 19:05

а ща ?

Niar 26.01.2010 19:06

Вроде нормально)
Хорошая пища для ума на завтра.
Спасибо.

Niar 27.01.2010 14:10

function err(e){throw e}
a = prompt('Введите "ошибка"');

try {
 try {
     err(a);
  } 
finally{
alert("Финалли");
}
}  
catch (e) {
if (e=='ошибка') alert('детектед ошибка');
 }

Почему тут срабатывает внешний catch?

PeaceCoder 27.01.2010 14:24

Цитата:

Сообщение от Niar
Почему тут срабатывает внешний catch?

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

Niar 27.01.2010 14:26

А что нельзя сделать чтобы сработал finally и всё?
Ведь вроде как catch не обязателен если стоит finally.

Мараторий 27.01.2010 14:30

Ловят ошибки только catch. Если нет ни одного catch, то доходит до window.onerror.

Niar 27.01.2010 14:31

Ясно. А при каких ошибка JS сам генерирует throw?

e1f 27.01.2010 15:02

http://javascript.ru/Error

Niar 27.01.2010 15:02

Спасибо

Мараторий 27.01.2010 16:10

А вот еще с таким сталкивался. В IE бросается исключение при попытке задать неправильный стиль. Это к какому типу ошибок относится?
try {
  document.body.style.height = "fgdfg";
} catch(e) {
    alert(e);
  }

Niar 27.01.2010 16:22

e.name выдаёт TypeError

Мараторий 27.01.2010 16:23

Пишет просто Error

Niar 27.01.2010 16:24

<html>
<head>
<meta charset="utf-8">
</head>
<script>
try {
  document.body.style.height = "fgdfg";
} catch(e) {
    alert(e.name);
  }
</script>
</html>

Проверте
P.S. Я проверял в мозиле
TypeError-Переменная или параметр неправильного типа

Мараторий 27.01.2010 16:32

В фф ошибка не генерируется.
В IE генерируется. При этом e.name="Error"

P.S.
try {
  document.body.style.height = "fgdfg";
} catch(e) {
    alert(e);
// У меня на странице выдает тоже, что и
    alert(e.name+": "+e.message);
// А на форуме выдает [object Error]
  }

Niar 27.01.2010 16:40

Я вам токо что код привёл. У меня в фф выдаёт TypeError я не знаю как вы проверяете.
Версия фф-3.5.7

Мараторий 27.01.2010 16:42

ФФ выдает ошибку потому, что у вас еще не создан объект body.

Мараторий 27.01.2010 16:44

вы такое в мозиле проверьте
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
try {
  document.body.style.height = "fgdfg";
} catch(e) {
    alert(e.name);
  }
</script>
</body>
</html>

Никакой ошибки.

Мараторий 27.01.2010 16:48

Через instanceof
try {
  document.body.style.height = "fgdfg";
} catch(e) {
    alert(e instanceof TypeError); // flase
    alert(e instanceof Error); // true
  }

Niar 27.01.2010 16:50

В хроме ваши примеры не запускаются=)
Значит проверяйте на все типы.

Мараторий 27.01.2010 16:53

Что значит не запускаются? Там, как и в фф не генерируется ошибка.

Niar 27.01.2010 17:06

Те примеры что вы на форуме приводите по кнопке Запустить! не запускаются
это просто так к сведенью

Мараторий 27.01.2010 17:18

Niar,
Что вы называете "запускаются"?
Если вы подразумеваете, что ничего не происходит, никаких алертов не выскакивает, то вы правы отчасти.

В нормальных браузерах действительно при этих действиях никаких ошибок не генерируется (ничего не происходит).
Но вот IE другое дело. Он генерирует ошибку при попытке назначить невалидный стиль DOM элементу.

P.S.
Кстати не обязательно через style.
element.align = "ggg" // В IE также генерирует ошибку.

Niar 27.01.2010 17:22

вы проверили через instanceof все типы ошибок?

Мараторий 27.01.2010 17:30

проверил, которые знал: EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError.
Ни один не подошел.
Может есть еще типы, которые я забыл?

Niar 27.01.2010 17:41

Может это просто Error?
Вы всё проверили
Или у ИЕ может свои типы есть

Niar 27.01.2010 17:44

Интересный момент что catch ловит только RangeError

Мараторий 27.01.2010 17:46

Да. похоже, что это просто Error.
Ведь можно самому сделать trow new Error().
На свои типы у IE не похоже, поскольку e.name="Error". Будь это спец тип, я думаю, было бы не просто Error.

Мараторий 27.01.2010 17:48

Цитата:

Сообщение от Niar (Сообщение 42361)
Интересный момент что catch ловит только RangeError

Что это значит? catch ловит любой Error, разве не так?

Niar 27.01.2010 17:50

то есть только ReferenceError
Вот например при SyntaxError даже если она сделана в try и есть catch то всё равно программа прерывается
То есть не если искусственно new SyntaxError а если реально синтакс. ошибку допустить.

Мараторий 27.01.2010 17:59

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

Niar 27.01.2010 18:05

Ловятся только ошибки времени то есть ReferenceError
Кстати на сайте статьи про типы объекта Error написаны убого. Ни одного примера одна-две строки и всё.

Мараторий 27.01.2010 18:12

Немного надо дополнить последний пост.
Такой код вообще не будет исполнен:
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 тоже исполнен в последнем примере не будет.

Мараторий 27.01.2010 18:15

Цитата:

Сообщение от Niar (Сообщение 42368)
Ловятся только ошибки времени то есть ReferenceError.

Это не так, например
try {
  new Array(-10);
} catch(e) {
    alert(e); // Ошибка RangeError
  }

Мараторий 27.01.2010 18:21

try {
  var str = "ggg";
  str();
} catch(e) {
    alert(e); // TypeError
  }

Niar 27.01.2010 18:25

Значит Дэвид опять соврал:D
про eval http://javascript.ru/EvalError


Часовой пояс GMT +3, время: 18:17.