C++ 异常处理涉及到三个关键字:
- try: try 块中的代码标识将被激活的特定异常,并由throw跳出try块,它后面通常跟着一个或多个 catch 块。
- throw: 在try的函数体内放置throw语句,通常后接字符串,throw会把该字符串隐式传递给catch的形参,并强制跳转到catch
- catch: catch的形参在收到throw的传值后,执行catch函数体内的内容,完毕后继续向下执行,直到程序结束
如果您想让 catch 块能够处理 throw抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...,如下所示:
try
{
// 保护代码
}catch(...)
{
// 能处理任何异常的代码
}
try
{
// 保护代码
}catch( ExceptionName e1 )
{
// catch 块
}catch( ExceptionName e2 )
{
// catch 块
}catch( ExceptionName eN )
{
// catch 块
}
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!"; //该语句会强制跳转到catch
}
return (a/b);
}
int main ()
{
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
}catch (const char* msg) { //接受throw传来的参数,并进入函数体
cerr << msg << endl;
}
return 0; //向下执行至程序结束
}
重载异常
- c++的所有标准异常类都继承于std::exception
- 所以重载异常需要包含<exception>头文件并继承std::exception
struct MyException : public exception //继承
{
const char * what () const throw ()
{
return "C++ Exception";
}
};
what() 是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因
解释:
- 1. const char * 表示返回值类型
- 2. what 是函数名称
- 3. () 是参数列表
- 4. const 表示该成员函数不能修改成员变量
- 5. throw() 是异常规格说明符。括号内写该函数可抛出的异常类型
void fun(); //该函数可以抛出所以异常
void fun() throw(A,B,C,D); //该函数可以抛出A,B,C,D四类异常
void fun() throw(); //该函数不能抛出任何异常 老版本
void fun() noexcept; //该函数不能抛出任何异常 c++11新版本
//不能抛出异常可以优化执行效率,但是如果真的有错误,会直接终止程序
//有条件的noexcept
void swap(Type& x, Type& y) noexcept(exp) //表明只要exp不抛出异常,则整个函数体不抛出异常
{
...
}
栗子:
#include <iostream>
#include <exception>
using namespace std;
struct MyException : public exception
{
const char* what() const throw ()
{
return "C++ Exception";
}
};
int main()
{
try
{
throw MyException(); //匿名对象(无参构造函数)
}
catch (MyException& e)
{
std::cout << "MyException caught" << std::endl;
std::cout << e.what() << std::endl;
}
}