C++的异常处理
需要用到的关键词包括try/throw/catch
try
try{}
try后跟一个代码块,代码块中可能会抛出异常
必须和(至少一个)catch搭配使用
throw
throw some_exp;
throw 抛出一个异常,异常可以是任何类型
抛出异常后,后面的代码不再执行,而是不断退出(回溯)
直到遇见能够处理该异常的catch
catch
catch(type some_value){}
catch捕获一个异常,后面括号中要说明其能够捕获的异常的类型
发生的异常,如果和它接受的类型匹配,那么该异常就由这个catch处理
一个try可以后续多个catch尝试捕获不同类型的异常
标准异常
普通的基本类型对异常的说明能力很弱(?)
C++标准提供了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::runtime_error,理论上不可以通过读取代码来检测到的异常
std::overflow_error,当发生数学上溢时,会抛出该异常
std::range_error,当尝试存储超出范围的值时,会抛出该异常
std::underflow_error,当发生数学下溢时,会抛出该异常