(一)异常处理的简介
异常处理是编程语言或者计算机硬件里面的一种机制,用于处理软件或者信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件);在软件开发中,异常处理机制是一种比较有效的处理系统运行时的错误方法。C++针对异常处理提供了一种标准的方法,用于处理程序运行是的错误,保证软件系统运行的稳定性与健壮性。但是异常处理没有普通方法函数调用速度快。过度的错误处理回影响应用程序的运行效率。
(二)异常处理的目的
通过异常处理,我们可以针对用户在程序中的非法操作进行控制和提示,防止程序崩溃;
(三)异常处理的使用方法
3.1异常处理1
C++中的异常处理主要使用了三个关键字:try、throw、catch;通常我们会先使用try块包含可能出现的异常代码,然后用两个辅助的操作来完成异常处理,两个辅助操作如下:
(1)满足某个条件时用throw关键字抛出异常;
(2)使用catch块来匹配抛出的异常后将其处理;
其中 try块用来包含可能会出现异常的语句;catch块用来捕捉和处理可能出现异常的语句中throw抛出的异常,并且能够和throw抛出的异常类型能够匹配;try—catch的语法如下:
try
{
包含可能抛出异常的语句
}
catch(类型名(参数名))//捕捉特定类型的异常
{
处理异常的语句
}
示例:
int fun(int a, int b)
{
if (b == 0)
throw "error!"; //在满足条件“b == 0”时,使用关键字“throw”抛出异常
return a / b;
}
int main()
{
try //try块中放着可能会出现异常的代码
{
fun(1, 0);
}
catch (const char* error) //catch用来捕捉放入try块的代码中抛出的char*类异常
{
cout << error << endl; //匹配到异常的处理代码
}
return 0;
}
3.2 异常处理2
在满足特定条件,throw抛出异常后,下面的语句将不会执行;
int fun2(int a, int b)
{
if (b == 0)
throw "find a error!"; //在满足条件“b == 0”时,使用关键字“throw”抛出异常
cout << "work is going on !" << endl;
return a / b;
}
int main()
{
try //try块中放着可能会出现异常的代码
{
fun2(1, 0);
}
catch (const char* error) //catch用来捕捉放入try块的代码中抛出的char*类异常
{
cout << error << endl; //匹配到异常的处理代码
}
return 0;
}
3.3抛出异常3
抛出异常是由程序员决定什么是异常,以及是否要抛出异常,抛出什么类型的异常;
(1)当我们认为被除数为1为异常,并将之抛出
int fun(int a, int b)
{
if (b == 1)
throw "find a error!";
return a / b;
}
int main()
{
try
{
fun(3, 1);
}
catch (const char* error)
{
cout << error << endl;
}
return 0;
}
(2)在任何情况下都不抛出异常
int fun(int a, int b) //fun函数不抛出异常
{
return a / b;
}
int main()
{
try //及时将fun代码块放入try块中,没有异常抛出,catch就捕获不到异常
{
fun(3, 1);
}
catch (const char* error)
{
cout << error << endl;
}
cout << fun(3,1) << endl;
return 0;
}
(3)抛出的异常类型
int fun1(int a, int b)
{
if (b == 1)
throw "find a error!"; //抛出char* 类型的异常
return a / b;
}
int fun2(int a, int b)
{
if (b == 1)
throw -1; //抛出int类型的异常
return a / b;
}
int main()
{
try
{
fun1(3, 1);
}
catch (const char* error) //捕捉char* 类型的异常
{
cout << error << endl;
}
try
{
fun2(3, 1);
}
catch (int error) //捕捉int类型的异常
{
cout << error << endl;
}
return 0;
}
【注:catch可以有自己匹配类型的功能,如下图所示:】
int fun(int a, int b)
{
if (b == 1)
//throw "find a error!"; //抛出char* 类型的异常;结果如图一所示
throw - 1; //抛出int类型的异常;结果如图二所示
return a / b;
}
int main()
{
try
{
fun(3, 1);
}
catch (const char* error) //捕捉char* 类型的异常
{
cout << error << endl;
}
catch (int error) //捕捉int类型的异常
{
cout << error << endl;
}
return 0;
}
结果1
结果2
3.4抛出异常4
有一种可以捕捉到任何类型异常的块,这种catch块是一种“保底办法”,防止因为有一些异常没有匹配的catch块而导致异常中止;语句如下所示:
try
{
语句块
}
catch(...)
{
语句块
}
【注:我们一般将匹配度高的catch块放在最前面,没有参数类型的catch块是通用性最强,针对性最差的,应该将其放在所有catch语句的最后,就像switc--case语句中的default一样】