[关闭]
@songying 2019-02-15T12:46:38.000000Z 字数 1595 阅读 1310

c++ 异常处理

c++


抛出异常 -- throw

当执行一个throw时,跟在throw后面的语句将不再执行,相反,程序的控制权从throw 转移到与之相匹配的catch模块。

控制权从一处转移到另一处,这有两个重要的含义:

  1. throw runtime_error("message")

捕捉异常 -- try

  1. try{
  2. // program
  3. } catch (exception_name){
  4. handle_expresssio
  5. } catch (exception_name){
  6. handle_expresssio
  7. }

定义新的异常

  1. class exception : public exception{
  2. const char * what () const throw (){
  3. return "C++ Exception";
  4. }
  5. }

栈展开过程

当抛出一个异常后,程序暂停当前函数的执行过程并立即开始寻找与异常匹配的catch子句。当throw出现在一个try语句块时,检查与该try关联的catch子句。

栈展开过程沿着嵌套函数的调用链不断查找,直到找到了与异常匹配的catch子句或退出主函数为止。

异常退出

当函数抛出异常后,其会寻找catch语句,如果没有找到匹配的catch,程序就会转到名为terminate 的标准库函数,一般情况下,执行该函数会导致程序非正常退出。

栈展开过程中对象被自动销毁

标准异常

c++ 标准库中定义了一组异常类,分别在4个头文件中:

异常 描述
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 当发生数学下溢时,会抛出该异常。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注