@songying
2019-02-15T12:46:38.000000Z
字数 1595
阅读 1310
c++
当执行一个throw时,跟在throw后面的语句将不再执行,相反,程序的控制权从throw 转移到与之相匹配的catch模块。
控制权从一处转移到另一处,这有两个重要的含义:
throw runtime_error("message")
try{
// program
} catch (exception_name){
handle_expresssio
} catch (exception_name){
handle_expresssio
}
class exception : public exception{
const char * what () const throw (){
return "C++ Exception";
}
}
当抛出一个异常后,程序暂停当前函数的执行过程并立即开始寻找与异常匹配的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 | 当发生数学下溢时,会抛出该异常。 |