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)

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

Цитата:

Сообщение от Niar (Сообщение 42373)
Значит Дэвид опять соврал:D
про eval http://javascript.ru/EvalError

Насчет чего он соврал?
Я пока не придумал как вызвать ошибку EvalError, кроме как ручками. Но Там вроде все нормально написано.
И почему "опять"?

Niar 27.01.2010 18:32

EvalError вызывает SyntaxError так что так вы её и не вызовите.
http://javascript.ru/forum/offtopic/...flehnagan.html

e1f 27.01.2010 18:41

Niar, необязатедльно SyntaxError:
try { eval('(1).replace(/a/,"")') } catch ( ex ) { console.info( ex ) }

Niar 27.01.2010 18:43

Я читал что eval лучше вообще не использовать

e1f 27.01.2010 18:43

Niar, и кто же такое написал?

Niar 27.01.2010 18:44

Да вроде где-то на этом форуме)

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

e1f,
А в каких случаях вызывается ошибка EvalError? Пример, если можно.

e1f 27.01.2010 18:47

Niar, почему нельзя вызвать EvalError:
try { new eval('1;') } catch ( ex ) { console.info( ex ) }


Мараторий, это и Вам ответ :) пока сходу другой пример не приведу. EvalError бросается при некорректом использовании евал. new eval() -- некорректно.

Niar 27.01.2010 18:50

Вы бы статьи написали по типам ошибок)

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

:)
Действительно. Корректным такое использование сложно назвать. Но тогда какое можно придумать практическое применение EvalError?

Niar 27.01.2010 18:56

Эээ у Дэвида написано что один из вариантов использования finally если try был закончен из-за инструкции break, continue или return. Если break можно еще использовать с меткой то как c continue и return там же SyntaxError

e1f 27.01.2010 19:00

Мараторий, еще можно так:
try { eval.call(document, '1') } catch ( ex ) { console.info(ex) }

Практически -- не знаю, разве что действительно отлавливать некорректное использование eval.
Здесь Есть дискуссия на подобную тему, вроде бы.

Niar 27.01.2010 19:06

Есть еще места где можно почитать об этом на русском?

e1f 27.01.2010 19:08

гугл ;)

Niar 27.01.2010 19:09

Я ему не верю)
Он один раз привёл меня на сайт где можно 1 000 000$ заработать и нифига. Обманул:nono:

Niar 27.01.2010 19:11

А можно я вас приведу пару примеров и вы мне расскажите правильно я понял алгоритм работы кода?

e1f 27.01.2010 19:13

Цитата:

Сообщение от Niar (Сообщение 42394)
Я ему не верю)
Он один раз привёл меня на сайт где можно 1 000 000$ заработать и нифига. Обманул:nono:

Фу, как не стыдно обвинять гугл в собственной некомпетентности :)
Цитата:

Сообщение от Niar (Сообщение 42395)
А можно я вас приведу пару примеров и вы мне расскажите правильно я понял алгоритм работы кода?

Давайте, попробуем.

Niar 27.01.2010 19:20

try {
throw new Error(404)
 }
finally {
alert("Пыщь-пыщь")
}
try{
throw new Error(405)
}
catch(e){
alert(e.message)
}

Тут сначала исполняется finally. Так как catch нету он ищет его дальше. Однако catch принадлежит другому try и в результате ошибка.
try{
throw new Error(405)
try {
throw new Error(404)
 }
finally {
alert("Пыщь-пыщь")
}
}
catch(e){
alert(e.message)
}

Тут сразу находит 405 ошибку и в результате остальной код try не исполняется и ищется catch, и находится.
try{
try {
throw new Error(404)
 }
finally {
alert("Пыщь-пыщь")
}
}
catch(e){
alert(e.message)
}

Тут сразу находит 404 ошибку и ищется catch. Но он находит только finally и исполняет его. Потом ищет catch на внешнем уровне и находит.

try {
throw new Error(404)
 }
finally {
alert("Пыщь-пыщь")
throw new Error(406)
}

А тут finally заменяет старое исключение на новое

Мараторий 27.01.2010 19:25

Да, вроде все верно.

Однако последний пример не тривиален для понимания.

Niar 27.01.2010 19:27

Не понятно только как try может быть завершён continue и return

e1f 27.01.2010 19:29

По последнему пункту:
finally не "заменяет" исключение, а генерирует еще одно, оно вылетает, поэтому первоначальное мы уже не можем увидеть. Чтобы увидеть, можно так:
try {
    throw new Error(404)
} catch (ex) {
    console.info(ex)
} finally {
    alert("Пыщь-пыщь")
    throw new Error(406)
}

Niar, форматируйте код отступами, влом читать :)

Niar 27.01.2010 19:30

Учту=)

Мараторий 27.01.2010 19:41

Цитата:

Сообщение от Niar (Сообщение 42399)
Не понятно только как try может быть завершён continue и return

Откуда вы такое вообще взяли? break, continue при вызове не в цикле и return не в функции дают SyntaxError.

Niar 27.01.2010 19:43

А всё Дэвид. Вот список причин исполнения finally если try закончен:
// 1) нормальным образом, достигнув конца блока
// 2) изза инструкции break, continue или return
// 3) с исключением, обработанным приведенным ранее блоком catch
// 4) с неперехваченным исключением, которое продолжает свое
// распространение на более высокие уровни

Кстате break можно заюзать с меткой
Кстате break без метки еще и в switch ошибки не даёт

Мараторий 27.01.2010 20:09

Niar,
Ну а почитать до конца религия не позволяет?
Там написан пример:
var i = 0,
    total = 0,
    a = [1, "str", "10", 2];
while(i < a.length) {
  try {
    if ((typeof a[i] != "number") || isNaN(a[i])) // Если это не число,
      continue; // переходим к следующей итерации цикла.
    total += a[i]; // В противном случае добавляем число к общей сумме.
  } finally {
      i++; // Всегда увеличиваем i, даже если ранее была инструкция continue.
    }
}
alert(total); // 3

PeaceCoder 28.01.2010 00:44

delete

x-yuri 28.01.2010 10:24

Цитата:

Сообщение от Niar
Я читал что eval лучше вообще не использовать

просто он редко нужен, и когда кто-то пытается использовать eval, это обычно значит, что you ain't gonna need it

по поводу ошибок: ловятся все ошибки времени выполнения, не ловится ни одна ошибка компиляции

Niar 28.01.2010 11:52

Какая еще религия

Мараторий 28.01.2010 14:41

Niar,
Не хотел никого обидеть. Просто есть такое выражение. Если вас задел, то извиняюсь.

Niar 28.01.2010 14:45

Да нет всё нормально.


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