尝试,捕获,并引发语句(C++)

C++ 异常使用在尝试捕获,并引发关键字。

引发表达式信号错误或异常情况。 可以使用任何类型的对象作为引发表达式的操作数。 此对象通常用于显示有关错误的信息。 通常,应使用该标准:: 异常在标准库中定义的类或派生类之一,或者,如果这些都不适用,然后派生自拥有从标准的异常类:: 异常。

尝试块内可能引发异常的一个或多个语句。

一个或多个 catch 块紧跟在 try 块。 每个 catch 块指定它可以处理异常的类型。

下面的语法演示 try 块及其处理程序。 假定, GetNetworkResource() 获取网络上的数据连接,因此,两个异常类型是用户定义的 std:: 异常 说明从派生的类异常通过引用在 catch 语句:

MyData md;
try {
   // code that could throw an exception
   md = GetNetworkResource();
}
catch (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 (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 子句是代码中控制的部分中。 引发表达式引发 () 引发异常。 代码块,在 catch 子句是异常处理程序后,并捕获 (处理) 引发表达式引发的异常,则将引发和捕获表达式的类型兼容。 到托管类型与 catch 块规则的列表,请参见 ___。 如果 catch 语句指定省略号 (...) 而不是类型, catch 零时块处理任何类型的异常,包括 C 异常与系统或应用程序生成的异常 (如内存保护、异常和浮点冲突。 由于 catch 块按程序顺序尝试,这样处理程序必须是其 try 的最后一个处理程序块。 使用 catch (...)小心;通常这样的 catch 块用于记录错误并在终止程序执行之前执行任何特殊清除。 不要允许程序将继续运行,除非 catch 块如何知道处理捕获的特定异常。

没有操作数再次引发的一个 引发表达式 当前正在处理的异常。 此类表达式只应出现在 catch 处理程序或于函数调用从 catch 处理程序内部。 再次引发的异常对象是原始异常对象 (而不是复制)。 例如:

try {
   throw CSomeOtherException();
}
catch(...) {  // Catch all exceptions – dangerous!!!
   // Respond (perhaps only partially) to exception
   throw;       // Pass exception to some other handler
}

请参见

参考

C++异常处理

C++关键字

C++未经处理的异常

__uncaught_exception

其他资源

如何:在基类构造函数 (C++) 的异常