捕获异常

try {
 
} catch (ExceptionName e1) {
 
} catch (ExceptionName e1) {
    
} ...

抛出异常

double division(int a, int b) {
    if( b == 0 ) {
        throw "Division by zero condition!";
    }
    return a / b;
}
graph LR
  std_exception[std::exception]
  bad_alloc[std::bad_alloc]
  domain_error[std::domain_error]
  bad_cast[std::bad_cast]
  invalid_argument[std::invalid_argument]
  bad_typeid[std::bad_typeid]
  length_error[std::length_error]
  bad_exception[std::bad_exception]
  out_of_range[std::out_of_range]
  logic_failure[std::logic_error]
  overflow_error[std::overflow_error]
  runtime_error[std::runtime_error]
  range_error[std::range_error]
  underflow_error[std::underflow_error]

  std_exception --> bad_alloc
  std_exception --> bad_cast
  std_exception --> bad_typeid
  std_exception --> bad_exception
  std_exception --> logic_failure
  std_exception --> runtime_error

  logic_failure --> domain_error
  logic_failure --> invalid_argument
  logic_failure --> length_error
  logic_failure --> out_of_range
  logic_failure --> overflow_error
  logic_failure --> range_error
  logic_failure --> underflow_error
异常描述
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::vectorstd::bitset<>::operator[]()
std::runtime_error理论上不可以通过读取代码来检测到的异常。
std::overflow_error当发生数学上溢时,会抛出该异常。
std::range_error当尝试存储超出范围的值时,会抛出该异常。
std::underflow_error当发生数学下溢时,会抛出该异常。