Здесь с помощью элемента exception
задается исключение, сгенерированное инструкцией throw. Если это исключение подлежит перехвату, то инструкция throw должна быть выполнена либо в самом блоке try, либо в любой вызываемой из него функции (т.е. прямо или косвенно).На заметку.
Если в программе обеспечивается "выброс" исключения, для которого не предусмотрена соответствующая catch-инструкция, произойдет аварийное завершение программы, вызываемое стандартной библиотечной функцией terminate(). По умолчанию функция terminate() вызывает функцию abort() для остановки программы, но при желании можно определить собственный обработчик ее завершения. За подробностями относительно обработки этой ситуации следует обратиться к документации, прилагаемой к вашему компилятору.Рассмотрим простой пример обработки исключений средствами языка C++.
// Простой пример обработки исключений.
#include
using namespace std;
int main()
{
cout << "HAЧAЛО\n";
try {
// начало try-блока
cout << "В trу-блоке\n";
throw 99; // генерирование ошибки
cout << "Эта инструкция не будет выполнена.";
}
catch (int i) {
// перехват ошибки
cout << "Перехват исключения. Его значение равно: ";
cout << i << "\n";
}
cout << "КОНЕЦ";
return 0;
}
При выполнении эта программа отображает следующие результаты.
НАЧАЛО В try-блоке
Перехват исключения. Его значение равно: 99
КОНЕЦ
Рассмотрим внимательно код этой программы. Как видите, здесь try
-блок содержит три инструкции, а инструкция catch(int i) предназначена для обработки исключения целочисленного типа. В этом try-блоке выполняются только две из трех инструкций: cout и throw. После генерирования исключения управление передается catch-выражению, при этом выполнение try-блока прекращается. Необходимо понимать, что catch-инструкция не вызывается, а просто с нее продолжается выполнение программы после "выброса" исключения. (Стек программы автоматически настраивается в соответствии с создавшейся ситуацией.) Поэтому cout-инструкция, следующая после throw-инструкции, никогда не выполнится.После выполнения catch
-блока управление программой передается инструкции, следующей за этим блоком. Поэтому ваш обработчик исключения должен исправить ошибку, вызвавшую его возникновение, чтобы программа могла нормально продолжить выполнение. В случаях, когда ошибку исправить нельзя, catch-блок обычно завершается обращением к функциям exit() или abort(). (Функции exit() и abort() описаны в разделе "Копнем глубже" ниже в этой главе.)Как упоминалось выше, тип исключения должен совпадать с типом, заданным в catch
-инструкции. Например, если в предыдущей программе тип int, указанный в catch-выражении, заменить типом double, то исключение перехвачено не будет, и произойдет аварийное завершение программы. Вот как выглядят последствия внесения такого изменения.
// Этот пример работать не будет.
#include
using namespace std;
int main()
{
cout << "НАЧАЛО\n";
try {
// начало try-блока
cout << "В trу-блоке\n";
throw 99; // генерирование ошибки
cout << "Эта инструкция не будет выполнена.";
}
catch (double i) {
// Перехват исключения типа int не состоится.
cout << "Перехват исключения. Его значение равно: ";
cout << i << "\n";
}
cout << "КОНЕЦ";
return 0;
}
Такие результаты выполнения этой программы объясняются тем, что исключение целочисленного типа не перехватывается инструкцией catch (double i)
.
НАЧАЛО
В try-блоке
Abnormal program termination
Функции exit() и abort() Функции exit()
и abort() входят в состав стандартной библиотеки C++ и часто используются в программировании на C++. Обе они обеспечивают завершение программы, но по-разному.