C++ 异常使用 try、catch 和 throw 关键字。
引发表达式指示错误或异常情况。 可以将任何类型的对象用作引发表达式的操作数。 此对象通常用于传达有关错误的信息。 通常,应使用在标准库中定义的 std::exception 类或某个派生类,或者,如果这些都不适用,则从 std::exception 派生自己的异常类。
try 块封装一个或多个可能引发异常的语句。
一个或多个 catch 块紧跟在 try 块之后。 每个 catch 块指定它能处理异常的类型。
以下语法显示一个示例 try 块及其处理程序。 假设 GetNetworkResource() 通过网络连接获取数据,并且两个异常类型是从 std::exception 中派生的用户定义的类,请注意,异常将通过 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 异常和系统或应用程序生成的异常,如内存保护、被零除和浮点冲突。 由于将尝试按程序顺序捕获块,因此该处理程序必须是其 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++这个用的比较少,像.net和java到处都是这个东西,如c#中的toint都有可能产生异常,c++中感觉操作数据库时用的比较多