try/throw/catch

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Monopo
Сообщения: 119
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

21 май 2008, 19:39

Объясните, пожалуйста, как работают эти волшебные слова: try/throw/catch? Желательно на примере.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

22 май 2008, 10:53

Это похоже на вопрос: "Расскажите, плз, в двух словах как программировать на C++".

Обсуждение концепции исключений и работы с ними займёт слишком много места на форуме и времени у пишущего. Предлагаю тебе изучить эту тему самостоятельно по мануалам (в конце-концов чем отличается чтение форума и мануала - разницы не вижу). Затем вернуться в эту тему, если захочется обсудить какое-то тонкости не освещённые или плохо освещённые в твоём источнике.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

22 май 2008, 11:01

вкратце: try{// подопытные операции, в результате выполнения которых может произойти аварийная ситуация, например - деление на 0}, catch{// блок, определяющий действия программы, если в блоке try возникло исключение}, throw генерирует определённое исключение. А подробнее - в книге.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

22 май 2008, 11:12

&quot писал(а):вкратце: try{// подопытные операции, в результате выполнения которых может произойти аварийная ситуация, например - деление на 0}, catch{// блок, определяющий действия программы, если в блоке try возникло исключение}, throw генерирует определённое исключение. А подробнее - в книге.
Деление на ноль является исключением лишь в Windows, так что прошу не обобщать. В Unixоидах, к примеру, - это сигнал. Сигнал не может быть отловлен catch'ем. Правильно говорить, что в try располагается код, который может бросить исключение. Аварийная ситуация - термин неуместный.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

22 май 2008, 12:59

Принято, Romeo.
Аватара пользователя
Monopo
Сообщения: 119
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

27 май 2008, 21:50

А что значит "бросить" исключение? Значит у меня в Linux деление на 0 не есть исключение?(
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

28 май 2008, 11:13

Бросить - фактически создать вручную исключительную ситуацию. Т.е. при выполнении a/b при нулевом b в той же винде появится страшное окошко с красным крестом и надписью типа "Ошибка ХХХ по адресу УУУ". Вместо этого можно написать что-то вроде: если b=0, бросить исключение "Ошибка в программе такой-то: такой-то параметр равен нулю, недопустимое значение". Намного приятнее разбирать.

Кстати, самый замечательный эксепшн я видел в Icewind Dale 2: "Попытка провалилась. Программист говорит, это неизвестный эффект номер 2671".
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

28 май 2008, 17:15

&quot писал(а):А что значит "бросить" исключение? Значит у меня в Linux деление на 0 не есть исключение?(
Деление на ноль в Windows является исключением и может быть отловлено в catch, в том время, как на юниксоидах, деление на ноль не является исключением, а является сигналом. Сигнал можно отловить другими средствами, но catch здесь уже не поможет. Самое правильное для случая "деление на ноль" - это перед делением проверять знаменатель на равенство нулю, как это отметил ранее Хыиуду, и, в случае равенства, отдельно обрабатывать эту ситуация, не полагаясь на особенности операционной системы. В этом случае твой код будет работать одинаково и на Win, и на любой юниксоподобной OS.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить