30.07.2012, 22:22
|
Новичок на форуме
|
|
Регистрация: 30.07.2012
Сообщений: 6
|
|
Вопрос по исключениям в 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 по классам?
|
|
30.07.2012, 22:29
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
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);
}
}
|
|
30.07.2012, 22:42
|
Новичок на форуме
|
|
Регистрация: 30.07.2012
Сообщений: 6
|
|
devote,
Сообщение от inslide
|
"если имеется соответствующий блок catch", а до этого не было написано, что есть несоответствующие блоки catch.
|
А в вашем примере есть один блок и он всегда соответствует
Сообщение от inslide
|
Например catch(e) и танцуют вокруг e.
|
|
|
31.07.2012, 00:42
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Одному блоку try может соответствовать только один блок catch, не более. Он идёт непосредственно после блока try. Скорее всего это и имелось ввиду, когда писалось "соответствующий блок catch".
В скобках после ключевого слова catch должен быть ровно один идентификатор. Его можно использовать внутри блока catch для получения соответствующего исключения.
Есть может бросаться несколько видов исключений, то тип исключения нужно определить внутри блока catch и в зависимости от него делать соответствующие действия, как devote показал на примере.
Последний раз редактировалось oneguy, 31.07.2012 в 00:48.
|
|
01.08.2012, 01:15
|
Новичок на форуме
|
|
Регистрация: 01.08.2012
Сообщений: 3
|
|
Вообще, все вот эти try-catch - по сути, очень вредная штука. Они позволяют прятать ошибки => в какой-то момент спрятанное исключение приведёт к более серьёзной поломке и всё рухнет.
Для процесса тестирования их ещё можно использовать, но лишь чтобы отловить ошибку и тут же её исправить.
|
|
01.08.2012, 01:49
|
|
Аспирант
|
|
Регистрация: 06.07.2012
Сообщений: 31
|
|
Сообщение от norlin
|
Вообще, все вот эти try-catch - по сути, очень вредная штука. Они позволяют прятать ошибки => в какой-то момент спрятанное исключение приведёт к более серьёзной поломке и всё рухнет.
Для процесса тестирования их ещё можно использовать, но лишь чтобы отловить ошибку и тут же её исправить.
|
Да с дуру можно и ... сломать.
Но отнють, try-сatch, не только для того что бы прятать ошибки, он используются в сложных приложениях с какой-либо выраженной архитектурой, где при возникновении нестандартной ситуации генерируется исключение, которое ловится try-сatch где-то уровнем выше, что позволяет корректно среагировать на эту ситуацию и выполнить в соответствии с этим необходимый код.
|
|
01.08.2012, 16:06
|
Новичок на форуме
|
|
Регистрация: 01.08.2012
Сообщений: 3
|
|
Сообщение от shkoder
|
Да с дуру можно и ... сломать.
Но отнють, try-сatch, не только для того что бы прятать ошибки, он используются в сложных приложениях с какой-либо выраженной архитектурой, где при возникновении нестандартной ситуации генерируется исключение, которое ловится try-сatch где-то уровнем выше, что позволяет корректно среагировать на эту ситуацию и выполнить в соответствии с этим необходимый код.
|
А для этого стоит использовать return. Либо, в асинхронных случаях, коллбэки, но уж никак не генерацию кастомных исключений.
|
|
01.08.2012, 16:22
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от norlin
|
но уж никак не генерацию кастомных исключений.
|
что за бред? если у меня метод должен принимать только конкретный тип данных, мне что, просто тупо выходить из метода и пусть разработчик мучается отлаживать код ища где проблема!? Именно в таких случаях и нужно генерить исключение, что бы разраб знал где искать причину останова. А обычный выход это лишь приведет к дополнительной рутинной работе в поиске ошибок.
|
|
01.08.2012, 16:43
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от inslide
|
hromium выдаёт "Uncaught SyntaxError: Unexpected identifier" на первом блоке catch. Закомментирую первый - выдаёт на втором.
Гуглю всякие статьи, везде используют один блок catch без указания какого-либо класса. Например catch(e) и танцуют вокруг e.
Так может в JS вообще нельзя ассоциировать исключение с блоком catch по классам?
|
вы синтаксис js знаете? что есть переменная, что можно использовать в названии и т.д? первые страницы Фленегана
Последний раз редактировалось dmitriymar, 01.08.2012 в 17:07.
|
|
01.08.2012, 16:47
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от inslide
|
Например catch(e) и танцуют вокруг e.
|
а посмотреть что такое е ? ссылается на объект Error, или на любое другое значение указанное в throw
|
|
|
|