一、异常
1.什么叫异常
遇到错误一般是exit或者return,但大型程序不允许关闭或退出,所以就需要一套很好的容错机制
容错包含:异常处理,标准错误码,错误日志log
2.异常的处理流程:
try(检查)->throw(抛出异常)catch->(捕获异常)
try:尝试检查代码块中是否有特定异常,如果有则丢给catch处理
throw: 当发现异常的时候,手动抛出一个异常
catch:捕获异常,也是当try发现异常后,catch处理
总结:当try遇到捕获到异常后try后的代码不会继续执行,直接跳转到catch中
当函数中丢异常throw后,则throw后面的不会执行
catch执行完成后,继续执行catch括号外的代码;
cathch中用三个点,表示可以捕获所有的异常 catch(...){ }
3.抛出不同类型的异常
格式: throw 类型;
注意:当抛出的类型有const修饰的时候,捕获也需要const修饰,严格类型匹配
4.捕获异常
catch(类型 变量){} 特定异常:只可以捕获到指定类型的异常
catch(...){} 所有异常:当catch中是三个点时,表明可以捕获所有异常
如果没有捕获所有异常,或者没有捕获throw对应的异常类型,则内核处理异常
注意:
同一种类型只可以一种catch捕获,通过catch的参数区别相同类型的不同异常
捕获异常的Catch是从第一个开始匹配,catch和throw的类型不同则匹配第二个;
catch(...)必须放所有catch最后,用来处理没有捕获的异常。一般情况下都会有
5.异常嵌套
在异常的try和catch中继续嵌入一个try和catch()
try
{
throw 12;
try
{
}
catch(...)
{
}
}
catch()
{
}
6.函数异常申明
在函数声明时,确定抛出的异常类型,增加代码可读性,增加捕获的确定性。
格式: 返回值 函数名(参数列表)throw(类型1,类型2){ }
解析:以上代码中,函数中只可以throw类型1和类型2,不允许丢其他类型
注意:
如果函数异常申明的时候是throw(int)则函数中只可以丢int类型的异常
如果函数异常申明的时候是throw(int)丢double异常,则捕获不到。内核处理
如果函数异常申明的时候是throw(),表明此函数不可以丢异常。不可以有throw
7.丢对象类型异常:
前奏:在丢异常过程中,可以直接对对象类型。Catch也可以捕获对象类型
int fun() throw(int,student)//student为student类
{
struct student stu;
if(stu.id<0)
{
throw stu.id;
}
if(stu.id>0)
{
throw stu;
}
}
int main()
{
try
{
fun();
}
catch(int error){}
catch(student error){}
catch(...){}
return 0;
}
8.标准异常派生类:(自定义的异常类)
定义:写一个类,继承exception类
格式:class student: public excepion{}