try、throw 和 catch 语句 (C++)

若要在 C++ 中实现异常处理,可以使用 trythrowcatch 表达式。

首先,使用 try 程序块将可能引发异常的一个或多个语句封闭起来。

throw 表达式发出信号,异常条件(通常是错误)已在 try 程序块中发生。 可以使用任何类型的对象作为 throw 表达式的操作数。 该对象一般用于传达有关错误的信息。 大多数情况下,建议使用 std::exception 类或标准库中定义的派生类之一。 如果其中的类不合适,建议你从 std::exception 派生自己的异常类。

若要处理可能引发的异常,请在 try 程序块之后立即实现一个或多个 catch 程序块。 每个 catch 程序块都会指定它能处理的异常类型。

以下示例将显示 try 程序块及其处理程序。 假设 GetNetworkResource() 通过网络连接获取数据,并且两个异常类型是从 std::exception 派生的用户定义的类。 请注意,异常由 catch 语句中的 const 引用捕获。 我们建议你通过值引发异常并通过常数引用将其捕获。

示例

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 子句后的代码块是异常处理程序。 如果 throwcatch 表达式中的类型兼容,该处理程序将捕获引发的异常。 有关管理 catch 程序块中的类型匹配的规则的列表,请参阅 Catch 程序块如何计算。 如果 catch 语句指定省略号 (...) 而非类型,则 catch 程序块将处理每种类型的异常。 当使用 /EHa 选项编译时,异常可包括 C 结构化异常和系统生成或应用程序生成的异步异常,例如内存保护、被零除和浮点冲突。 由于 catch 程序块按编程顺序处理来查找匹配类型,所以尽量不要使用省略号处理程序来处理关联的 try 程序块。 请谨慎使用 catch(...);除非 catch 块知道如何处理捕获的特定异常,否则禁止程序继续执行。 catch(...) 块一般用于在程序停止执行前记录错误和执行特殊的清理工作。

没有操作数的 throw 表达式将重新引发当前正在处理的异常。 建议在重新引发异常时采用此形式,因为这将保留原始异常的多态类型信息。 此类表达式只应在 catch 处理程序中或从 catch 处理程序调用的函数中使用。 重新引发的异常对象是原始异常对象,而不是副本。

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