C++Primer学习——第5章 语句

本文详细介绍了C++中的范围for语句、try-catch异常处理机制以及标准库异常类的使用。范围for语句方便地遍历序列,try-catch结构用于捕获和处理运行时异常,而标准库异常类如runtime_error、logic_error等提供了丰富的错误信息。通过what()函数,可以获取异常的文本描述。异常处理确保程序在遇到错误时能优雅地恢复或终止。
摘要由CSDN通过智能技术生成

语句

范围for语句

这种语句可以遍历容器或其他序列的所有元素。**范围for语句(range for statement)**的语法形式:

    for (declaration : expression)
        statement

expression表示的是一个序列,declaration定义了一个变量。

try语句块和异常处理

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

  • throw表达式(throw expression),异常检测部分使用throw表达式来表示它遇到了无法处理的问题,我们说throw引发(raise)了异常。
  • try语句块(try block)异常处理部分使用try语句块处理异常。try语句块以关键字try开始,并以一个或多个catch子句(catch clause)结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为catch子句“处理”异常,所以它们也被称为异常处理代码(exception handler)
  • 一套异常类(exception class),用于在throw表达式和相关的catch子句之间传递异常的具体信息。

throw表达式


if(item.isbn() != item2.isbn())
    throw runtime_error("Data must refer to same ISBN"); //抛出异常中止程序

try语句块


try{
    program-statements
} catch (exception-declaration){
    handler-statements
} catch (exception-declaration){
    handler-statements
}//....

try语句块的一开始是关键字try,随后紧跟着一个块。跟在块后面的是一个或多个catch子句。catch子句包括三部分:关键字、catch、括号内一个(可能未命名的)对象的声明(称作异常声明,exception declaration)以及一个块。catch一旦完成,程序跳转到try语句块最后一个catch子句之后的那条语句继续执行。

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


while(cin >> item1 >> item2){
    try{
    //执行添加两个Sales_item对象的代码
    //如果添加失败,代码抛出一个 runtime_error异常
    } catch (runtime_error err){
        //提醒用户两个ISBN必须一致,询问是否重新输入
        cout    << err.what()
            << "\nTry Again? Enter y or n" << endl;
        char c;
        cin >> c;

        if(!cin || c == 'n')
            break;
    }
}

  1. 每个标准库异常类都定义了名为what的成员函数,这些函数没有参数,返回值是C风格字符串(const char*)
  2. 当异常被抛出时,首先搜索抛出该异常的函数。如果没有找到匹配的catch子句,终止该函数,并在调用该函数的函数中继续寻找。如果还是没有找到匹配的catch子句,这个新的函数也被终止,继续搜索调用它的函数。以此类推,沿着程序的执行路径逐层回退,直到找到适合类型的catch子句为止。
  3. 如果最终没找到任何匹配的catch子句,程序转到名为terminate的标准库函数。该函数的行为与系统有关,一般情况下,执行该函数将导致程序非正常退出。
  4. 如果一段程序没有try语句块且发生了异常,系统会调用terminate函数并终止当前程序的执行。

标准异常

  • exception头文件定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外信息。
  • stdexcept头文件定义了几种常用的异常类。
  • new头文件定义了bad_alloc异常类型
  • type_info头文件定义了bad_cast异常类型

定义的异常类

exception最常见的问题
runtime_error只有在运行时才能检测出的问题
range_error运行时错误,生成的结果超出了有意义的值域范围
overflow_error运行时错误,计算上溢
underflow_error运行时错误,计算下溢
logic_error程序逻辑错误
domain_error逻辑错误:参数对应的结果值不存在
invalid_argument逻辑错误:无效参数
length_error逻辑错误:试图创建一个超出该类型最长长度的对象
out_of_range逻辑错误:使用一个超出有效范围的值
  1. 我们只能以默认初始化的方式初始化exception、bad_alloc和bad_cast对象,不允许为这些对象提供初始值
  2. 其他异常类型的行为则恰好相反:应该使用string对象或者C风格字符串初始化这些类型的对象,但是不允许使用默认初始化的方式。当创建此类对象时,必须提供初始值。
  3. 异常类型只定义了一个名为what的成员函数,该函数没有任何参数,返回值是一个指向C风格字符串的const char*。该字符串的目的是提供关于异常的一些文本信息。
  4. what函数返回的C风格字符串的内容与异常对象的类型有关,如果异常类型有一个字符串初始值,则what返回该字符串。对于其他无初始值的异常类型来说,what返回的内容由编译器决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值