Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.07.2012, 22:22
Новичок на форуме
Отправить личное сообщение для inslide Посмотреть профиль Найти все сообщения от inslide
 
Регистрация: 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 по классам?
Ответить с цитированием
  #2 (permalink)  
Старый 30.07.2012, 22:29
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 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);
    }
}
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #3 (permalink)  
Старый 30.07.2012, 22:42
Новичок на форуме
Отправить личное сообщение для inslide Посмотреть профиль Найти все сообщения от inslide
 
Регистрация: 30.07.2012
Сообщений: 6

devote,

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

Сообщение от inslide Посмотреть сообщение
Например catch(e) и танцуют вокруг e.
Ответить с цитированием
  #4 (permalink)  
Старый 31.07.2012, 00:42
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

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

Последний раз редактировалось oneguy, 31.07.2012 в 00:48.
Ответить с цитированием
  #5 (permalink)  
Старый 01.08.2012, 01:15
Новичок на форуме
Отправить личное сообщение для norlin Посмотреть профиль Найти все сообщения от norlin
 
Регистрация: 01.08.2012
Сообщений: 3

Вообще, все вот эти try-catch - по сути, очень вредная штука. Они позволяют прятать ошибки => в какой-то момент спрятанное исключение приведёт к более серьёзной поломке и всё рухнет.
Для процесса тестирования их ещё можно использовать, но лишь чтобы отловить ошибку и тут же её исправить.
Ответить с цитированием
  #6 (permalink)  
Старый 01.08.2012, 01:49
Аватар для shkoder
Аспирант
Отправить личное сообщение для shkoder Посмотреть профиль Найти все сообщения от shkoder
 
Регистрация: 06.07.2012
Сообщений: 31

Сообщение от norlin Посмотреть сообщение
Вообще, все вот эти try-catch - по сути, очень вредная штука. Они позволяют прятать ошибки => в какой-то момент спрятанное исключение приведёт к более серьёзной поломке и всё рухнет.
Для процесса тестирования их ещё можно использовать, но лишь чтобы отловить ошибку и тут же её исправить.
Да с дуру можно и ... сломать.
Но отнють, try-сatch, не только для того что бы прятать ошибки, он используются в сложных приложениях с какой-либо выраженной архитектурой, где при возникновении нестандартной ситуации генерируется исключение, которое ловится try-сatch где-то уровнем выше, что позволяет корректно среагировать на эту ситуацию и выполнить в соответствии с этим необходимый код.
Ответить с цитированием
  #7 (permalink)  
Старый 01.08.2012, 16:06
Новичок на форуме
Отправить личное сообщение для norlin Посмотреть профиль Найти все сообщения от norlin
 
Регистрация: 01.08.2012
Сообщений: 3

Сообщение от shkoder Посмотреть сообщение
Да с дуру можно и ... сломать.
Но отнють, try-сatch, не только для того что бы прятать ошибки, он используются в сложных приложениях с какой-либо выраженной архитектурой, где при возникновении нестандартной ситуации генерируется исключение, которое ловится try-сatch где-то уровнем выше, что позволяет корректно среагировать на эту ситуацию и выполнить в соответствии с этим необходимый код.
А для этого стоит использовать return. Либо, в асинхронных случаях, коллбэки, но уж никак не генерацию кастомных исключений.
Ответить с цитированием
  #8 (permalink)  
Старый 01.08.2012, 16:22
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от norlin
но уж никак не генерацию кастомных исключений.
что за бред? если у меня метод должен принимать только конкретный тип данных, мне что, просто тупо выходить из метода и пусть разработчик мучается отлаживать код ища где проблема!? Именно в таких случаях и нужно генерить исключение, что бы разраб знал где искать причину останова. А обычный выход это лишь приведет к дополнительной рутинной работе в поиске ошибок.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #9 (permalink)  
Старый 01.08.2012, 16:43
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 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.
Ответить с цитированием
  #10 (permalink)  
Старый 01.08.2012, 16:47
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от inslide
Например catch(e) и танцуют вокруг e.
а посмотреть что такое е ? ссылается на объект Error, или на любое другое значение указанное в throw
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по JavaScript и проигрыванию звука через FLASH Opusel Events/DOM/Window 0 30.11.2011 18:18
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
Вопрос о циклических ссылках (JavaScript -> Dom -> JavaScipt) BlueIce Events/DOM/Window 10 17.02.2010 21:58
Есть вопрос по Javascript JsLoveR Opera, Safari и др. 1 23.12.2009 01:04