CustomException(const char* why):Reason(why) {}
1 1 :
// переопределение виртуальной функции для возвращения 'Reason'
virtual const char* what() const throw()
{
return Reason.c_str();
}
};
18:
19: double Divide(double Dividend, double Divisor)
Как действует обработка исключений
|
617
|
20: {
if(Divisor == 0)
throw CustomException("CustomException: \ Dividing by 0 is a crime");
23:
return (Dividend / Divisor);
}
26:
int main()
{
cout « "Enter dividend: ";
double Dividend = 0;
cin » Dividend;
cout « "Enter divisor: ";
double Divisor = 0;
cin » Divisor;
try
{
cout « "Result of division is: "
Divide(Dividend, Divisor);
}
catch(exceptions exp) // обрабатывает CustomException,
bad_alloc и т.д.
{
cout « exp.what() « endl;
cout « "Sorry, can't continue!" « endl;
}
44:
return 0;
}
Результат
Enter dividend: 2011
Enter divisor: 0
CustomException: Dividing by 0 is a crime
Sorry, can't continue!
Анализ
Это версия листинга 28.3, который передавал простое исключение типа c h a r * при делении на нуль. Теперь, однако, создается экземпляр класса C u s to m E x c e p tio n , опре деленного в строках 5 -17, как производного от класса s t d : : e x c e p tio n . Обратите вни мание на то, что наш класс исключения реализует виртуальную функцию w h at () в стро ках 13-16, по существу, возвращая причину передачи исключения. Логика обработчика c a tc h ( e x c e p tio n s ) в функции m ain () (строки 39 -43) обрабатывает не только исклю чения класса C u sto m E x c e p tio n , но и других типов, например b a d _ a llo c , у которых тот же базовый класс e x c e p tio n .
ЗАНЯТИЕ 28. Обработка исключений
Обратите внимание на объявление виртуального метода c-ustomException::
what () в строке 13 листинга 28.5:
virtual const char* what() const throw()
Оно заканчивается функцией throw (), означая, что данная функция сама, как ожидается, не передаст исключения - это очень важное и уместное ограниче ние для класса, объект которого используется как исключение. Если вы все же вставите оператор throw в эту функцию, то можете ожидать предупреждение от компилятора.
Если объявление функции заканчивается throw ( i n t ) , то это значит, что функ ция ожидает передачи исключения типа in t .
РЕКОМЕНДУЕТСЯ
Помните об обработке исключения типа s t d : :ex c ep tio n
Помните о наследовании собственного специ ального класса исключения (и любого другого) от класса s t d : : except ion
Передавайте исключения осмотрительно. Они не замена для возвращения таких значений, как tr u e или f a l s e
НЕ РЕКОМЕНДУЕТСЯ
Не передавайте исключения из деструкторов
Не считайте успех резервирования памяти само собой разумеющимся; код, применяющий оператор new, всегда следует заключать в блок t r y и создавать соответствующий обработчик
Не вставляйте сложнуюлогику или резервиро вание ресурсов в блок c a tc h (). Нельзя пере давать исключения при их обработке
Резюме
На этом занятии вы узнали очень важную часть практического программирования C++. Создание приложений, стабильных вне собственной среды разработки, важно для клиен та, как и интуитивно понятные пользователям сообщения. Это именно то, что позволяют сделать исключения. Вы узнали, что код, который резервирует ресурсы или память, может подвести, а следовательно, он требует обработки исключения. Вы узнали, что язык C++ обладает классом исключения s t d : : e x c e p t i o n , а при необходимости создать собствен ный специальный класс исключения имеет смысл наследовать его.
Do'stlaringiz bilan baham: |