C语言传统处错误的方式
- 终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。
- 返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误
- C 标准库中setjmp和longjmp组合。这个不是很常用,可以了解一下
实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。
鉴于上述的错误处理机制对程序员来说不是很友好,于是C++中就引入了异常处理机制。
C++异常的概念
异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。并且让程序继续执行下去而不是立即终止程序。
这里可以举一个例子
直接处理:例如函数A中突然出现了除以0的异常错误,而我在函数A中去捕获这个异常,并且去处理了这个异常,从而使得程序能够继续运行下去。
间接处理:例如函数A中出现了某个异常,而我并没有在函数A中去处理这个异常,而是来到调用函数A的函数B中,如果函数B没有处理这个异常,那么继续向上一层的函数调用者返回,以此类推,最终,如果向上层返回给了main函数,那么main函数就必须处理这个异常,如果main函数不处理这个异常,那么程序一样会因为异常而立即终止。
C++异常处理的语法
- 当问题出现时,程序会抛出一个异常。这时,通过throw关键字来完成的
表达式的值可以是基本类型,也可以是类
throw 表达式//表达式的值可以是基本类型,也可以是类
-
当问题已经出现,那么我想要在我想处理问题得地方,通过异常处理程序捕获这个异常,就需要catch关键字来捕获异常,并且可以有多个catch来进行捕获
-
try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch块
try{
被保护的代码
}
catch(捕获的异常1){
异常处理代码
}
catch(捕获的异常2){
异常处理代码
}
...
catch(捕获的异常n){
异常处理代码
}
示例
假定test函数中出现a-b小于0的异常,那么我抛出一个int类型的异常,这时,下面测catch块中就会捕获对应类型的异常。
#include<iostream>
using namespace std;
void test()
{
try{
double a = 2.0,b = 3.0;
if(a - b < 0){
throw -1;
}
}
catch(int){
cout<<"catch int"<<endl;
}
catch(char){
cout<<"catch char"<<endl;
}
cout<<"test finished"<<endl;
}
int main()
{
test();
cout<<"in main()"<<endl;
return 0;
}
运行结果如下,可以看出出现异常了,处理异常后使得程序继续执行直到结束。
再看间接异常的处理
#include<iostream>
using namespace std;
void test(