#include <iostream> using namespace std; /* // try/catch 语句的语法如下所示: try { // 保护代码 }catch( ExceptionName e1 ) { // catch 块 }catch( ExceptionName e2 ) { // catch 块 }catch( ExceptionName eN ) { // catch 块 } //异常概览及说明 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当发生数学下溢时,会抛出该异常。 */ /***********除零异常实例*************/ double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); } int main1() { int x = 5; int y = 0; double z = 0; try { z = division(x,y); cout << z << endl; }catch(const char* msg){ //由于division(a,b)抛出了一个类型为 const char* 的异常,因此, //当捕获该异常时,我们必须在 catch 块中使用 const char*。 cerr << msg << endl; //Division by zero condition! } return 0; } /* //定义新的异常---可以通过继承和重载 exception 类来定义新的异常 */ #include <exception> struct MyException : public exception { /* const throw(type)不是函数,这个东西叫异常规格说明, 表示what函数可以抛出异常的类型,类型说明放到()里, 下面的括号中没有类型,就是声明这个函数中不抛出异常 通常函数不写后面的const throw()就表示函数中可以抛出任何类型的异常 异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些 */ //what() 是异常类提供的一个公共方法,它已被所有子异常类重载。这将返回异常产生的原因。 const char* what() const throw() /* 第二个const 限定函数,因此可以在const对象上调用它,不能直接修改对象的成员 */ { return "C++ Exception"; } }; int main() { try { throw MyException(); //抛出自定义异常 } catch(MyException& e) { cout << "MyException caught" << endl; cout << e.what() << endl; } return 0; } </exception></iostream>