C++异常
一、什么是异常
用官方的话来说就是程序在执行过程中产生的问题,换句通俗的话来讲就是程序执行的出现的异常,比如程序崩了、内存泄漏了、数组越界以及其他异常信息的出现。
二、异常处理
C++中异常处理主要是使用三个关键字:try、catch和throw;
- throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
- catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
- try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。
我们看一下案例:
#include <iostream>
using namespace std;
double div(int a,int b)
{
if(0 == b)
{
throw "b is zero ,please check!!!";
}
return a/b;
}
int main()
{
try
{
double result = div(2,0);
cout<<result<<endl;
}
catch(const char* msg)
{
cout<<msg<<endl;
}
return 0;
}
结果:
/C++/exception$ ./test1
b is zero ,please check!!!
从案例中我们可以看到,div函数中,如果参数b出现为0的情况,那么就会抛出一个const char*的异常,我们再主程序中获取到这个异常;
三、异常的优点
假设b为0的时候,我们没有抛出异常,那么程序会出现什么现象?毫无疑问,程序会奔溃,无法继续运行;我们换一种思路想想一下,在我们实际生产中,如果正在运行的程序,由于某个异常数据,直接挂掉,那么老大还不把你宰了(刚好猪肉贵~~~);所以,使用异常的好处就出现了,使用异常可以很好的规避程序由于异常直接挂掉的风险。
四、C++标准异常
C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常
异常说明:
先说一下C++标准异常机制:
a)C++提供了标准异常类exception,这个类是所有标准异常的基类,其析构函数为虚函数
b)提供统一接口 const char* what() const 来作为各种标准异常对外的唯一接口
c)捕获任何标准异常只需要捕获这个类的引用即可捕捉到各种标准异常
d)之所以需要各种异常类型是因为可以在某个局部代码中只捕获某一种派生异常,其他异常留到外面去处理,认为当前地方处理不了。
注意:
a)标准异常的构造函数必须提供显示异常类型以及字符串参数作为构造函数的参数
b)也就是说异常发生之后我们只需要catch到这个异常并调用what方法看看发生了什么事情就足够了
c)如果你用字符串作为抛出异常的类型,你只能捕获字符串类型的异常,而不可能是string,也不可能是任何标准异常
d)抛出什么类型就只能捕获什么类型,或者这个类型的基类型。
e)自定义异常类型基本上可以认为是多此一举(在众多工程中管理这个异常类的头文件和源文件不胜其烦),因为我们只需要获取what就可以解决问题
五、使用案例
#include <iostream>
#include <exception>
using namespace std;
void run_error()
{
throw runtime_error("run_error test");
}
void test_char()
{
throw "char is test";
}
int main()
{
try
{
run_error();
}
catch(exception& e)
{
cout<<e.what()<<endl;
}
try
{
test_char();
}
catch(string& str)
{
cout<<str<<endl;
}
catch(exception& e)
{
cout<<e.what()<<endl;
}
catch(const char* e)
{
cout<<e<<endl;
}
return 0;
}
结果:
C++/exception$ ./test2
run_error test
char is test
想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:C++后台服务器开发