异常是在执行程序期间出现的问题. C ++异常是对程序运行时出现的异常情况的响应,例如尝试除以零.
异常提供了一种从一个部分转移控制的方法程序到另一个. C ++异常处理基于三个关键字:尝试,捕获,和抛出.
投掷 : 当问题出现时,程序会抛出异常.这是使用 throw 关键字完成的.
catch : 程序在您要处理问题的程序中的位置捕获异常处理程序的异常. catch 关键字表示捕获异常.
尝试 : try 块标识将激活特定异常的代码块.接下来是一个或多个catch块.
假设一个块会引发一个异常,一个方法使用一个组合来捕获一个异常. 尝试和抓住关键字. try/catch块放在可能生成异常的代码周围. try/catch块中的代码称为受保护代码,使用try/catch的语法如下 :
try { // protected code } catch( ExceptionName e1 ) { // catch block } catch( ExceptionName e2 ) { // catch block } catch( ExceptionName eN ) { // catch block }
你可以列出多个 catch 如果您的尝试块在不同情况下引发多个异常,则会捕获不同类型的异常的语句.
使用 throw 语句可以在代码块中的任何位置抛出异常. throw语句的操作数确定异常的类型,可以是任何表达式,表达式结果的类型决定抛出的异常类型.
以下是抛出的示例除以零条件时发生异常 :
double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); }
catch 块后面的>尝试阻止捕获任何异常.您可以指定要捕获的异常类型,这由关键字catch后面的括号中显示的异常声明确定.
try { // protected code } catch( ExceptionName e ) { // code to handle ExceptionName exception }
上面的代码将捕获 ExceptionName 类型的异常.如果要指定catch块应该处理try块中抛出的任何类型的异常,则必须在括起异常声明的括号之间放置省略号,如下所示 :
try { // protected code } catch(...) { // code to handle any exception }
以下是一个例子,它抛出除零异常,我们在catch块中捕获它.
#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); } int main () { int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; } catch (const char* msg) { cerr << msg << endl; } return 0; }
因为我们引发类型 const char * 的异常,所以在捕获此异常时,我们有在catch块中使用const char *.如果我们编译并运行上面的代码,这将产生以下结果 :
除以零条件!
C ++提供了< exception>中定义的标准异常列表我们可以在我们的程序中使用它.它们排列在下面显示的父子类层次结构中;<
以下是上述层次结构中提到的每个例外的小描述 :
Sr.No | 例外&说明 |
---|---|
1 | std :: exception 所有标准C ++异常的异常和父类. |
2 | std :: bad_alloc 这可以通过 new 抛出. |
3 | std :: bad_cast 这可以通过 dynamic_cast . |
4 | std :: bad_exception 这是处理C ++程序中意外异常的有用设备. |
5 | std :: bad_typeid 这可以通过 typeid 抛出. |
6 | std :: logic_error 理论上的一个例外可以通过阅读代码来检测. |
7 | std :: domain_error 这是数学上无效的域时抛出的异常使用. |
8 | std :: invalid_argument 由于参数无效而引发此事. |
9 | std :: length_error 当创建一个太大的std :: string时抛出此内容. |
10 | std :: out_of_range 这可以通过'at'抛出方法,例如std :: vector和std :: bitset<> :: operator [](). |
11 | std :: runtime_error 一个例外,理论上无法通过阅读代码来检测. |
12 | std :: overflow_error 如果发生数学上的溢出,则抛出此内容. |
13 | std :: range_error 当您尝试存储超出范围的值时会发生这种情况. |
14 | std :: underflow_error 如果发生数学下溢,则抛出此信息. |
您可以通过继承和覆盖异常类功能来定义自己的异常.下面是一个示例,它显示了如何使用std :: exception类以标准方式实现自己的异常 :
#include <iostream> #include <exception> using namespace std; struct MyException : public exception { const char * what () const throw () { return "C++ Exception"; } }; int main() { try { throw MyException(); } catch(MyException& e) { std::cout << "MyException caught" << std::endl; std::cout << e.what() << std::endl; } catch(std::exception& e) { //Other errors } }
这将产生以下结果 :
MyException caught C++ Exception
这里, what()是异常类提供的公共方法,它已被所有子异常类覆盖.这将返回异常的原因.