C++中的异常处理详细说明
看代码的过程中,经常看到try{}catch{}语句块,而且还经常性的看到这样的语句
try { //保护代码 } catch(...) { //处理任何异常的代码 }
刚开始我对catch(...)非常困惑,因为C#中并没有这样的用法. 所以,特意来了解学习一下C++中的异常处理方式
通常来说,try{}catch{}块中,try块中的代码我们称之为保护代码,catch中代码为处理(捕获)异常的代码, 还有个关键字throw,是扔出(抛出)异常的代码
throw抛出异常的代码,可以在代码块中的任何位置,任何地方. 比如我们在C++中实现除法运算时,如果除数为0,肯定会抛出异常,如下
double Division(int a, int b) { if(b == 0) { throw "Division by zero is not allowed" } return (a/b); }
一个try块后面,可以跟着多个catch块,意思就是说,这个try块可能抛出多种异常(多个异常),我们可以每个异常有一个对应的catch。 如果你想让catch块能够去处理try块抛出的任何类型的异常,那么就可以使用catch(..) => 这也就是我在代码中经常看到catch(...)却不知道具体为何意的解释
我们来看一下一个try语句,抛出多种异常的可能性的情况
try {
//保护代码 } catch(Exception1 e1) //处理捕获第1种类型的异常 { } catch(Exception2 e2) //处理捕获第2种类型的异常 { } ........ catch(ExceptionN eN) //处理捕获第N种类型的异常 { }
我们还是以上面的除法中除数为0的异常作为类子,来看我们的代码写法
#include <iostream> using namespace std; double Division(int a, int b) { if(b == 0) { throw "Division by zero is not allowed" } return (a/b); } int main() { int a = 4; int b = 0; double c = 0; try{ c = Division(a,b); cout << c << end1; } catch(const char* except) { cout << except <<end1; } return 0; }
由于我们在Division函数中抛出的是一个字符串常量类型的异常(const char*类型的异常), 所以,我们在catch块中捕获该异常时,必须使用const char*类型
上面代码编译和执行时,输出
Division by zero is not allowed
在C++中,定义了一些标准的异常,它们在命名空间std:exception中,我们也可以通过继承和重载std:exception来定义和实现自己的自定义异常。 具体我就不在这里阐述了