try/throw/catch
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Объясните, пожалуйста, как работают эти волшебные слова: try/throw/catch? Желательно на примере.
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Это похоже на вопрос: "Расскажите, плз, в двух словах как программировать на C++".
Обсуждение концепции исключений и работы с ними займёт слишком много места на форуме и времени у пишущего. Предлагаю тебе изучить эту тему самостоятельно по мануалам (в конце-концов чем отличается чтение форума и мануала - разницы не вижу). Затем вернуться в эту тему, если захочется обсудить какое-то тонкости не освещённые или плохо освещённые в твоём источнике.
Обсуждение концепции исключений и работы с ними займёт слишком много места на форуме и времени у пишущего. Предлагаю тебе изучить эту тему самостоятельно по мануалам (в конце-концов чем отличается чтение форума и мануала - разницы не вижу). Затем вернуться в эту тему, если захочется обсудить какое-то тонкости не освещённые или плохо освещённые в твоём источнике.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
вкратце: try{// подопытные операции, в результате выполнения которых может произойти аварийная ситуация, например - деление на 0}, catch{// блок, определяющий действия программы, если в блоке try возникло исключение}, throw генерирует определённое исключение. А подробнее - в книге.
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Деление на ноль является исключением лишь в Windows, так что прошу не обобщать. В Unixоидах, к примеру, - это сигнал. Сигнал не может быть отловлен catch'ем. Правильно говорить, что в try располагается код, который может бросить исключение. Аварийная ситуация - термин неуместный." писал(а):вкратце: try{// подопытные операции, в результате выполнения которых может произойти аварийная ситуация, например - деление на 0}, catch{// блок, определяющий действия программы, если в блоке try возникло исключение}, throw генерирует определённое исключение. А подробнее - в книге.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Принято, Romeo.
А что значит "бросить" исключение? Значит у меня в Linux деление на 0 не есть исключение?(
Бросить - фактически создать вручную исключительную ситуацию. Т.е. при выполнении a/b при нулевом b в той же винде появится страшное окошко с красным крестом и надписью типа "Ошибка ХХХ по адресу УУУ". Вместо этого можно написать что-то вроде: если b=0, бросить исключение "Ошибка в программе такой-то: такой-то параметр равен нулю, недопустимое значение". Намного приятнее разбирать.
Кстати, самый замечательный эксепшн я видел в Icewind Dale 2: "Попытка провалилась. Программист говорит, это неизвестный эффект номер 2671".
Кстати, самый замечательный эксепшн я видел в Icewind Dale 2: "Попытка провалилась. Программист говорит, это неизвестный эффект номер 2671".
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
- Romeo
- Сообщения: 3091
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Деление на ноль в Windows является исключением и может быть отловлено в catch, в том время, как на юниксоидах, деление на ноль не является исключением, а является сигналом. Сигнал можно отловить другими средствами, но catch здесь уже не поможет. Самое правильное для случая "деление на ноль" - это перед делением проверять знаменатель на равенство нулю, как это отметил ранее Хыиуду, и, в случае равенства, отдельно обрабатывать эту ситуация, не полагаясь на особенности операционной системы. В этом случае твой код будет работать одинаково и на Win, и на любой юниксоподобной OS." писал(а):А что значит "бросить" исключение? Значит у меня в Linux деление на 0 не есть исключение?(
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.