Обработка исключений
Во время работы программы могут возникать различные ошибки,
которые необходимо корректно обработать. Есть несколько способов в
вызываемом методе класса или функции сообщить о возникновении ошибки:
изменить глобальный
объект или поле класса, видимый из других частей
программы; вернуть в возвращаемом значении код успешности операции (так
функция main() возвращает '0' в случае успешного завершения и значение,
отличное от нуля, в случае возникновения той или иной ошибки). Оба способа
не позволяют прервать исполнение кода после возникновения ошибки.
Возможность прерывания исполнения предоставляют исключения (exeptions).
try
{
...;
// в блоке может быть создано исключение, вызвав 'throw'
}
catch (T t)
{
...;
// операторы обработки исключения если создано исключение типа T
}
catch (S t)
{
...;
// операторы обработки исключения если создано исключение типа S
}
catch (...)
{
...;
// во всех остальных случаях
}
Исключение создает функция 'throw'. В момент исключения исполнение
кода прерывается и продолжается в соответствующем обработчике (блоке
'catch').
В случае возникновения ошибки во время выполнения конструктора
исключение корректным и удобным способом ее обработать.
Использовать
исключения допустимо не только для обработки ошибок, но и для нормального
прерывания выполнения функции, например,
функции ввода при вводе
пользователем определенной команды.
Пример использования стандартного исключения для обработки ошибки,
предоставляемого стандартной библиотекой в заголовке
#include
#include
using namespace std;
int main()
{
try {
cout << "Starting try block" << endl;
63
throw runtime_error("any text here: test exception");
cout << "Ending try block" << endl;
} catch (const exception& e) {
cout << "Exception: " << e.what() << endl;
}
}
В качестве исключений можно использовать объект любого класса,
например фундаментального типа 'int'. Можно использовать класс,
наследующий классу 'exception' стандартной
библиотеки или можно
использовать любой другой класс. Объект-исключение можно создавать
оператором 'new' в динамической памяти. Важно не забыть удалить его в
обработчике.
#include
class E: public exception
{
virtual const char* what() const throw()
{
return "another exception";
}
} ;
try
{
// выберите любой из трех вариантов создать исключение,
//
перечисленных ниже:
//throw 1;
//throw E();
//throw new E;
}
catch (int& e)
{
cout << "integer as an exception" << e << endl;
}
catch (exception& e)
{
cout << "standard exception" << e.what() << endl;
}
catch (exception* e)
{
cout << "exception object pointer " << e->what() << endl;
delete e;
}
64
При объявлении функций и методов после ее сигнатуры (типа
возвращаемого значения, имени и списка параметров) можно указать тип
исключения, которое может создвать функция
void f();
// может инициировать исключения любого типа
void f() throw(int, runtime_error);
// может создать 'int'
//
или 'runtime_error'
void f() throw();
// пустой список - не инициирует исключений
void f() throw;
// если за сигнатурой функции не указан ни один тип
//
исключения, функция не генерирует новые исключения, но
//
может передавать дальше исключения, полученные от
//
вызываемых ею функций.
Do'stlaringiz bilan baham: