C++ 提供了异常(Exception)机制,让我们能够捕获运行时错误,给程序一次“起死回生”的机会,或者至少告诉用户发生了什么再终止程序。首先应包含头文件 #include <stdexcept>。
一、throw表达式:异常检测部分使用throw表达式来表示它遇到了无法处理的问题,throw引发了异常。
throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。throw表达式后面通常紧跟一个分号,从而构成一条表达式语句。
可以理解为人为地抛出自定义的异常类型,可以用于代码中符合某些条件时刻意地制造一些异常信息抛出给控制台处理,比如如下例子:
Sales_item item1,item2;
if(!item1.same_isbn(item2)) //当item1和item2的ISBN不同时,抛出异常
throw runtime_error("Data must refer to same ISBN");
cout << item1 + item2 << endl;
try-catch结构用于捕捉程序中会出现的异常,并对异常进行处理,try一下某句代码会不会有异常,如果有的话catch某种类型的异常,并进行处理:
try{
可能出现异常的语句;
}
catch(异常种类1 异常变量名1){
处理第一种异常的语句;
}
catch(异常种类2 异常变量名2){
处理第二种异常的语句;
}
二、try语句块:异常处理部分使用try语句块处理异常。
try语句块以关键字try开始,并以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句处理异常,所以它们也被称作异常处理代码。try语句块声明的变量在块外部无法访问,特别是在catch子句内也无法访问。如果一段程序没有try语句块且发生了异常,系统会调用terminate函数并终止当前程序的执行。
三、catch子句:包括三部分:关键字catch、括号内一个(可能未命名的)对象的声明(称作异常声明,exception declaration)以及一个块。
当选中了某个catch子句处理异常之后,执行与之对应的块。catch一旦完成,程序跳转到try语句块最后一个catch子句之后的那条语句继续执行。一套异常类(exception class):用于在throw表达式和相关的catch子句之间传递异常的具体信息。C++标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用,它们分别定义在4个头文件中。
(1)、exception头文件定义了最通常的异常类exception,它只报告异常的发生,不提供任何额外的信息。
(2)、stdexcept头文件定义了几种常用的异常类,如下(《C++ Primer(Fifth Edition)》):
(3)、new头文件定义了bad_alloc异常类型。
(4)、type_info头文件定义了bad_cast异常类型。
参考https://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htm
C++ Standard Exceptions
C++ provides a list of standard exceptions defined in <exception> which we can use in our programs. These are arranged in a parent-child class hierarchy shown below −
Here is the small description of each exception mentioned in the above hierarchy −
Sr.No | Exception & Description |
---|---|
1 |
std::exception An exception and parent class of all the standard C++ exceptions. |
2 |
std::bad_alloc This can be thrown by new. |
3 |
std::bad_cast This can be thrown by dynamic_cast. |
4 |
std::bad_exception This is useful device to handle unexpected exceptions in a C++ program. |
5 |
std::bad_typeid This can be thrown by typeid. |
6 |
std::logic_error An exception that theoretically can be detected by reading the code. |
7 |
std::domain_error This is an exception thrown when a mathematically invalid domain is used. |
8 |
std::invalid_argument This is thrown due to invalid arguments. |
9 |
std::length_error This is thrown when a too big std::string is created. |
10 |
std::out_of_range This can be thrown by the 'at' method, for example a std::vector and std::bitset<>::operator[](). |
11 |
std::runtime_error An exception that theoretically cannot be detected by reading the code. |
12 |
std::overflow_error This is thrown if a mathematical overflow occurs. |
13 |
std::range_error This is occurred when you try to store a value which is out of range. |
14 |
std::underflow_error This is thrown if a mathematical underflow occurs. |