尝试,捕获,并引发语句(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
}