C++异常处理
一、异常使用
C++可以配合使用try、throw和catch来实现异常的处理。即在try确定的“保护代码”内,使用throw抛出异常,并用catch捕获异常。用一段代码来说明:
#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } 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) { cerr << msg << endl; } return 0; }
上述代码不会执行return (a / b);而是在判断b==0后,抛出一个const char*类型的异常,并被catch捕获,并打印出。
二、标准异常和定义新异常
C++中还可以通过继承 exception 类定义新的异常,以一段代码来说明:
#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; } catch (std::exception& e) { //其他的错误 } system("pause"); }
上述代码中:
1)what()重载了exception类的what方法,用户自定义了其实现,即打印出“C++ Exception”。what()的返回值是 C 风格字符串(即 const char *)。除了通过继承exception定义新的异常外,C++还有一系列标准异常,如runtime_error,它就含有what()方法:
while (cin >> item1 >> item2){ try{ //执行添加两个Sales_item对象的代码 //如果添加失败,代码抛出一个runtime_error异常 } catch (runtime_error err){ //提醒用户两个ISBN必须一致,询问是否重新输入 cout << err.what() << "\nTry Again? Enter y or n" << endl; char c; cin >> c; İf (!cin || c == 'n') break;//跳出while循环 } }
2)const char * what() const throw ()中的const throw()不是函数,这个叫异常规格说明,它表示what()可以跑出的异常的类型,()为空。表示what本身不抛出异常。
3)各种标准异常
异常 | 描述 |
---|---|
std::exception | 该异常是所有标准 C++ 异常的父类。 |
std::bad_alloc | 该异常可以通过 new 抛出。 |
std::bad_cast | 该异常可以通过 dynamic_cast 抛出。 |
std::bad_exception | 这在处理 C++ 程序中无法预期的异常时非常有用。 |
std::bad_typeid | 该异常可以通过 typeid 抛出。 |
std::logic_error | 理论上可以通过读取代码来检测到的异常。 |
std::domain_error | 当使用了一个无效的数学域时,会抛出该异常。 |
std::invalid_argument | 当使用了无效的参数时,会抛出该异常。 |
std::length_error | 当创建了太长的 std::string 时,会抛出该异常。 |
std::out_of_range | 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator[]()。 |
std::runtime_error | 理论上不可以通过读取代码来检测到的异常。 |
std::overflow_error | 当发生数学上溢时,会抛出该异常。 |
std::range_error | 当尝试存储超出范围的值时,会抛出该异常。 |
std::underflow_error | 当发生数学下溢时,会抛出该异常。 |