C++ 异常处理
异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。
异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw。
- throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
- catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
- try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。
如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。
const throw() 不是函数,这个东西叫异常规格说明,表示 what 函数可以抛出异常的类型,类型说明放到 () 里,这里面没有类型,就是声明这个函数不抛出异常,通常函数不写后面的就表示函数可以抛出任何类型的异常。
class MyException :public exception { public: const char* what() const throw(){ return "my exception"; } };
异常规格说明
1、异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些。
可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:
void fun() throw(A,B,C,D);
2、若无异常接口声明,则此函数可以抛掷任何类型的异常。
3、不抛掷任何类型异常的函数声明如下:
#include <iostream> #include <exception> using namespace std; class MyException { public: MyException(const char *message) : message_(message) { cout << "MyException ..." << endl; } MyException(const MyException &other) : message_(other.message_) { cout << "Copy MyException ..." << endl; } virtual ~MyException() { cout << "~MyException ..." << endl; } const char *what() const { return message_.c_str(); } private: string message_; }; class MyExceptionD : public MyException { public: MyExceptionD(const char *message) : MyException(message) { cout << "MyExceptionD ..." << endl; } MyExceptionD(const MyExceptionD &other) : MyException(other) { cout << "Copy MyExceptionD ..." << endl; } ~MyExceptionD() { cout << "~MyExceptionD ..." << endl; } }; void fun(int n) throw (int, MyException, MyExceptionD) { if (n == 1) { throw 1; } else if (n == 2) { throw MyException("test Exception"); } else if (n == 3) { throw MyExceptionD("test ExceptionD"); } } void fun2() throw() { } int main(void) { try { fun(2); } catch (int n) { cout << "catch int ..." << endl; cout << "n=" << n << endl; } catch (MyExceptionD &e) { cout << "catch MyExceptionD ..." << endl; cout << e.what() << endl; } catch (MyException &e) { cout << "catch MyException ..." << endl; cout << e.what() << endl; } return 0; }