c++try语句块和异常处理

    异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。典型的异常包括失去数据库连接以及遇到意外输入等。处理反常行为可能是设计所有系统最难的一部分。

    如果程序中含有可能引发异常的代码,那么通常也会有专门的代码处理问题。例如,如果程序的问题是输入无效,则异常处理部分可能会要求用户重新输入正确的数据;如果丢失了数据库连接,会发出报警信息。

    异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。在C++语言中,异常处理包括:

    ●throw表达式。异常检测。

    ●try语句块。异常处理。

    ●一套异常类,用于在throw表达式和相关的catch子句之间传递异常的具体信息。

 

throw表达式

    程序的异常检测部分使用throw表达式引发一个异常。throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。throw表达式后面紧跟一个分号,从而构成一条表达式语句。

    throw runtime_error("Data must refer to ...");

    抛出的异常是类型runtime_error的对象。抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码。

 

 

try语句块

try{

    program-statements

}catch(exception-declaration){

    handler-statments

}catch(exception-declaration){

    handler-statements

}//...

一如往常,try语句块内声明的变量在块外部无法访问,特别是在catch子句内也无法访问。

    函数在寻找处理代码的过程中退出

    一个try语句块可能调用了包含另一个try语句块的函数,新的try语句块可能调用了包含又一个try语句块的新函数,以此类推。

    寻找处理代码的过程与函数调用链刚好相反。当异常被抛出时,首先搜索抛出该异常的函数。如果没有找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找。以此类推,沿着程序的执行路径逐层回退,直到找到适当类型的catch子句为止。

    如果最终还是没能找到任何匹配的catch子句,程序转到名为terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。

    如果一段程序没有try语句块且发生了异常,系统会调用terminate函数并终止当前程序的执行。

    note:编写异常安全的代码非常困难

    异常中断了程序的正常流程。

    对于一些程序来说,当异常发生时只是简单地终止程序。

    但是对于那些要处理异常并继续执行的程序,就要加倍注意了。我们必须时刻清楚异常何时发生,异常发生后程序应如何确保对象有效、资源无泄漏、程序处于合理状态,等等。

 

 

标准异常

    c++标准库定义了一组类,用于报告标准库函数遇到的问题。这些异常类也可以在用户编写的程序中使用,它们分别定义在4个头文件中:

    exception

    st

dexcept

    new

    type_info

    标准库异常类只定义了几种运算,包括创建或拷贝异常类型的对象,以及为异常类型的对象赋值。

    应该使用string对象或者C风格字符串初始化这些类型的对象,但是不允许使用默认初始化的方式。当创建此类对象时,必须提供初始值,该初始值含有错误相关的信息。除了exception、bad_alloc和bad_cast对象,不允许为这些对象提供初始值。

       <stdexcept>定义的异常类

    exception最常见的问题

    runtime_error只有在运行时才能检测出的问题

    range_error运行时的错误:生成的结果超出了有意义的值域范围

    overflow_error运行时错误:计算上溢

    underflow_error运行时错误:计算下溢

    logic_error程序逻辑错误

    domain_error逻辑错误:参数对应的结果值不存在

    invalid_argument  逻辑错误:无效参数

    length_error逻辑错误:试图创建一个超出该类型最大长度的对象

    out_of_range逻辑错误:使用一个超出有效范围的值

 

posted @ 2017-11-25 09:02  哲贤  阅读(1869)  评论(0编辑  收藏  举报