Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по исключениям в JavaScript (https://javascript.ru/forum/misc/30298-vopros-po-isklyucheniyam-v-javascript.html)

inslide 30.07.2012 22:22

Вопрос по исключениям в JavaScript
 
По мере чтения Флэнагана на разделе с исключениями возникли вопросы.

Я не очень понял когда нужно использовать какие-то классы в исключениях, когда не нужно. В книге написано: "если имеется соответствующий блок catch", а до этого не было написано, что есть несоответствующие блоки catch. Я полагаю, catch должны быть разными, чтобы соответствовать разным исключениям, но не знаю как исключения и catch должны быть описаны, чтобы соответствовать друг другу.

Предположил:
var grom = {};
var ololo = {};
try
{
    throw new grom();
}
catch(ololo e){alert('ololo e');}
catch(grom e){alert('grom e');}
catch(e){alert('e');}


Chromium выдаёт "Uncaught SyntaxError: Unexpected identifier" на первом блоке catch. Закомментирую первый - выдаёт на втором.

Гуглю всякие статьи, везде используют один блок catch без указания какого-либо класса. Например catch(e) и танцуют вокруг e.

Так может в JS вообще нельзя ассоциировать исключение с блоком catch по классам?

devote 30.07.2012 22:29

var grom = function(){};
var ololo = function(){};
try
{
    throw new grom();
}
catch(e) {
    if ( e instanceof grom ) {
        alert('grom '+ e);
    }
    if ( e instanceof ololo ) {
        alert('ololo '+ e);
    }
}

inslide 30.07.2012 22:42

devote,

Цитата:

Сообщение от inslide (Сообщение 193078)
"если имеется соответствующий блок catch", а до этого не было написано, что есть несоответствующие блоки catch.

А в вашем примере есть один блок и он всегда соответствует :)

Цитата:

Сообщение от inslide (Сообщение 193078)
Например catch(e) и танцуют вокруг e.


oneguy 31.07.2012 00:42

Одному блоку try может соответствовать только один блок catch, не более. Он идёт непосредственно после блока try. Скорее всего это и имелось ввиду, когда писалось "соответствующий блок catch".
В скобках после ключевого слова catch должен быть ровно один идентификатор. Его можно использовать внутри блока catch для получения соответствующего исключения.
Есть может бросаться несколько видов исключений, то тип исключения нужно определить внутри блока catch и в зависимости от него делать соответствующие действия, как devote показал на примере.

norlin 01.08.2012 01:15

Вообще, все вот эти try-catch - по сути, очень вредная штука. Они позволяют прятать ошибки => в какой-то момент спрятанное исключение приведёт к более серьёзной поломке и всё рухнет.
Для процесса тестирования их ещё можно использовать, но лишь чтобы отловить ошибку и тут же её исправить.

shkoder 01.08.2012 01:49

Цитата:

Сообщение от norlin (Сообщение 193464)
Вообще, все вот эти try-catch - по сути, очень вредная штука. Они позволяют прятать ошибки => в какой-то момент спрятанное исключение приведёт к более серьёзной поломке и всё рухнет.
Для процесса тестирования их ещё можно использовать, но лишь чтобы отловить ошибку и тут же её исправить.

Да с дуру можно и ... сломать.
Но отнють, try-сatch, не только для того что бы прятать ошибки, он используются в сложных приложениях с какой-либо выраженной архитектурой, где при возникновении нестандартной ситуации генерируется исключение, которое ловится try-сatch где-то уровнем выше, что позволяет корректно среагировать на эту ситуацию и выполнить в соответствии с этим необходимый код.

norlin 01.08.2012 16:06

Цитата:

Сообщение от shkoder (Сообщение 193471)
Да с дуру можно и ... сломать.
Но отнють, try-сatch, не только для того что бы прятать ошибки, он используются в сложных приложениях с какой-либо выраженной архитектурой, где при возникновении нестандартной ситуации генерируется исключение, которое ловится try-сatch где-то уровнем выше, что позволяет корректно среагировать на эту ситуацию и выполнить в соответствии с этим необходимый код.

А для этого стоит использовать return. Либо, в асинхронных случаях, коллбэки, но уж никак не генерацию кастомных исключений.

devote 01.08.2012 16:22

Цитата:

Сообщение от norlin
но уж никак не генерацию кастомных исключений.

что за бред? если у меня метод должен принимать только конкретный тип данных, мне что, просто тупо выходить из метода и пусть разработчик мучается отлаживать код ища где проблема!? Именно в таких случаях и нужно генерить исключение, что бы разраб знал где искать причину останова. А обычный выход это лишь приведет к дополнительной рутинной работе в поиске ошибок.

dmitriymar 01.08.2012 16:43

Цитата:

Сообщение от inslide
hromium выдаёт "Uncaught SyntaxError: Unexpected identifier" на первом блоке catch. Закомментирую первый - выдаёт на втором.

Гуглю всякие статьи, везде используют один блок catch без указания какого-либо класса. Например catch(e) и танцуют вокруг e.

Так может в JS вообще нельзя ассоциировать исключение с блоком catch по классам?

вы синтаксис js знаете? что есть переменная, что можно использовать в названии и т.д? первые страницы Фленегана

dmitriymar 01.08.2012 16:47

Цитата:

Сообщение от inslide
Например catch(e) и танцуют вокруг e.

а посмотреть что такое е ? ссылается на объект Error, или на любое другое значение указанное в throw


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