异常处理
异常处理
作者:千里马的驴
日期:2020.4.15
基础知识
异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。
异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。
- throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
- catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
- try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。
如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码
try
{
// 保护代码
}catch( ExceptionName e1 )
{
// catch 块
}catch( ExceptionName e2 )
{
// catch 块
}catch( ExceptionName eN )
{
// catch 块
}c
如果 try 块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。
Demo
//抛出异常
int division(int a, int b)
{
if(b == 0){
throw "division is zero!";
}
return (a/b);
}
//捕获异常
int main()
{
int ret;
try{
ret = division(2, 0);
printf("ret = %d\n", ret);
}
catch(const char *msg)
{
printf("msg = %s\n", msg);
}
return 0;
}
结果:msg = division is zero!
如何定义新的异常
可以通过继承和重载 exception 类来定义新的异常。
Demo(注意对比上一个Demo)
//定义一个自己实现的异常
class IException :public std::exception
{
public:
const char *what()
{
return "this is my exception";
}
};
//抛出异常
int division(int a, int b)
{
if(b == 0){
throw IException();
}
return (a/b);
}
//捕获异常
int main()
{
int ret;
try{
ret = division(2, 0);
printf("ret = %d\n", ret);
}
catch(IException& e)
{
printf("an error occur: %s\n", e.what());
}
catch(const char *msg)
{
printf("msg = %s\n", msg);
}
return 0;
}
结果:an error occur: this is my exception
异常应用的场景
一般来说当出现一个无法处理行为,这些行为超出了函数正常功能的范围。典型的异常包括失去数据库连接以及遇到意外输入等。当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。
注意:如果抛出异常之后不做处理,那么一般会出现段错误,也就是通过看到的程序奔溃;
还是使用上面那个例子,如果我们将主函数改成
int main()
{
int ret;
try{
ret = division(2, 0);
printf("ret = %d\n", ret);
}
//注释掉这个段后,抛出的异常无法被处理,程序奔溃
/*
catch(IException& e)
{
printf("an error occur: %s\n", e.what());
}
*/
catch(const char *msg)
{
printf("msg = %s\n", msg);
}
return 0;
}
结果:段错误,程序奔溃
terminate called after throwing an instance of 'IException'
what(): std::exception
Aborted (core dumped)