Операторы try, throw и catch (C++)
Для реализации обработки исключений в C++используется try
throw
и catch
выражения.
Во-первых, используйте try
блок для заключения одного или нескольких операторов, которые могут вызвать исключение.
throw
Выражение сигнализирует о том, что исключительное условие ( часто ошибка) произошла в блокеtry
. Объект любого типа можно использовать в качестве операнда throw
выражения. Обычно этот объект используется для передачи информации об ошибке. В большинстве случаев рекомендуется использовать std::exception
класс или один из производных классов, определенных в стандартной библиотеке. Если один из них не подходит, рекомендуется наследовать собственный класс исключений.std::exception
Для обработки исключений, которые могут быть возникают, реализуйте один или несколько catch
блоков сразу после try
блока. Каждый catch
блок указывает тип исключения, который он может обрабатывать.
В этом примере показан try
блок и его обработчики. Предположим, GetNetworkResource()
получает данные через сетевое подключение, а 2 типа исключений являются определенными пользователем классами, производными от std::exception
. Обратите внимание, что исключения перехватываются по const
ссылке в инструкции catch
. Рекомендуется создавать исключения по значению и захватывать их ссылкой константы.
Пример
MyData md;
try {
// Code that could throw an exception
md = GetNetworkResource();
}
catch (const networkIOException& e) {
// Code that executes when an exception of type
// networkIOException is thrown in the try block
// ...
// Log error message in the exception object
cerr << e.what();
}
catch (const myDataFormatException& e) {
// Code that handles another exception type
// ...
cerr << e.what();
}
// The following syntax shows a throw expression
MyData GetNetworkResource()
{
// ...
if (IOSuccess == false)
throw networkIOException("Unable to connect");
// ...
if (readError)
throw myDataFormatException("Format error");
// ...
}
Замечания
Код после try
предложения является защищенным разделом кода. Выражение throw
вызывает исключение. Блок кода после catch
предложения является обработчиком исключений. Это обработчик, который перехватывает исключение, которое создается, если типы в throw
выражениях catch
совместимы. Список правил, которые управляют сопоставлением типов в catch
блоках, см. в разделе "Оценка блоков catch". catch
Если инструкция задает многоточие (...) вместо типа, catch
блок обрабатывает каждый тип исключения. При компиляции с /EHa
параметром они могут включать структурированные исключения C и системные или асинхронные исключения, созданные приложением, такие как защита памяти, разделение на ноль и нарушения с плавающей запятой. Так как catch
блоки обрабатываются в программе, чтобы найти соответствующий тип, обработчик многоточия должен быть последним обработчиком для связанного try
блока. Используйте с осторожностью; не позволяйте catch(...)
программе продолжать работу, если блок catch не знает, как обрабатывать определенное исключение, которое поймано. Как правило, блок catch(...)
используется для ведения журнала ошибок и выполнения специальной очистки перед остановкой выполнения программы.
Выражение throw
, которое не имеет операнда повторно выполняет обработку исключения. Мы рекомендуем эту форму при повторном создании исключения, так как это сохраняет сведения о полиморфном типе исходного исключения. Такое выражение должно использоваться только в catch
обработчике или в функции, которая вызывается из обработчика catch
. Объект исключения rethrown является исходным объектом исключения, а не копией.
try {
throw CSomeOtherException();
}
catch(...) {
// Catch all exceptions - dangerous!!!
// Respond (perhaps only partially) to the exception, then
// re-throw to pass the exception to some other handler
// ...
throw;
}
См. также
Современные рекомендации по C++ по исключению и обработке ошибок
Ключевые слова
Необработанные исключения C++
__uncaught_exception