C++异常处理
程序错误大致有三种:
-
语法错误
编译链接阶段可以发现
-
逻辑错误
编写程序逻辑错误,达不到预期的目标,通过调试排查解决
-
运行时错误
程序编译链接解决都没有出错,语法完全符合规则, 但是在运行时候程序出错,严重的终止程序运行(程序崩溃)
C++异常处理机制
为捕获解决运行时错误而诞生,给程序复活的机会,至少告诉用户发生了什么严重故障再终止程序
异常类头文件:
#include <exception> //包含异常类头文件
捕获异常语法:
try{
<code block A> //可能产生异常的语句
}catch(exception type var){
<code block B> //处理异常的语句
}
尝试(try)执行code block A代码,没有异常正常执行,有异常的话就会捕获(catch)异常,执行code block B异常处理代码
-
exception type指明了异常类型即指定了对应catch语句能处理什么类型异常。异常类型可以是C++支持的所有数据类型。
-
exception是异常类,C++语言本身及其标准库产生的异常都是exception类的子类,为标准异常。抛出异常时,会创建一个exception类或子类对象。
-
var 类似函数的形参,存放异常信息,抛出的异常数据类型和var 类型匹配上才会执行相应的catch语句
捕获所有标准异常:
try{ //可能抛出异常的语句 }catch(exception &e){ //处理异常的语句 }
多级catch:
try{ <code block A> //可能产生异常的语句 }catch(exception type var){ <code block B> //处理异常的语句 }catch(exception type1 var){ <code block C> //处理异常的语句 }catch(exception type2 var){ <code block D> //处理异常的语句 }
从上往下逐级执行,异常信息类型和哪个catch里面的参数一致就执行哪个捕获语句
一般用法:在可能产生异常的代码加上try和catch,常见的异常有除数为0,数据越界,内存分配失败等。
抛出异常
C++使用throw关键字来抛出异常,在执行到throw语句后,throw语句后面的代码没有执行的机会
throw语句必须在try语句中或者在try语句调用的函数中执行。
void test_exception(void)
{
try{
throw "this is a exception!"; //抛出异常
}catch(const char* e){ //捕获异常
cout << e << endl;
}
}
int main(void)
{
test_exception();
return 0;
}
除数为0异常:
int div_exception_test(int x, int y)
{
int result;
try{
result = x / y;
}catch(...){
cout << "除数不能为0" << endl;
}
return result;
}
int main(void)
{
printf("result = %d", div_exception_test(20, 0)); //有了try catch,计时除数为0,程序也不会崩溃。
return 0;
}