zoukankan      html  css  js  c++  java
  • try语句块和异常处理(throw)

    异常处理包括

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

    throw表达式

    程序的异常检测使用部分使用throw表达式引发一个异常。throw表达式包含关键字throw和紧随其后的一个表达式,其中表达式的类型就是抛出的异常类型。

    举个简答的例子

    Sales_item item1, item2;
    cin >> item2 >> item2;
    // 首先检查item1和item2是否表示同一种书籍
    if (item1.isbn() == item2.isbn()){
        cout << item1 + item2 << endl;
        return 0;
    }
    else{
        cerr << "Data must refer to same ISBN" << endl;
        return -1;
    }
    

    在真实的程序中应该把对象相加的代码和用户交互的代码分离开来。

    此例中,我们改写程序使得检查完成后不再直接输出一条信息,而是抛出一个异常:

    if (item1.isbn() != item2.isbn()){
        throw runtime_error("Data must refer to same ISBN");
    }
    // 如果程序执行到了这里,表示两个ISBN是一样的
    cout << item1 + item2 << endl;
    

    在这段代码中,如果ISBN号不一样就抛出一个异常,该异常的类型是runtime_error的对象。

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

    try语句块

    在前面的例子中,我们使用了一个throw表达式以避免把两个代表不同书籍的Sales_item相加。

    程序本来要执行的任务出现在try语句块中,这是因为这段代码可能会抛出一个runtime_error类型的异常。

    while (cin >> item1 >> item2){
        try{
            // 执行添加两个Sales_item对象的代码
            // 如果添加失败,代码抛出一个runtime_error异常
        }catch (runtime_error err){
            // 提醒用户两个ISBN必须一致
            cout << err.what()
                 << "
    Try Again? Enter y or n" << endl;
            char c;
            cin >> c;
            if (!cin || c == 'n')
                break;
        }
    }
    

    try语句块对应一个catch子语句,该子语句负责处理类型为runtime_error的异常。

    如果try语句块的代买抛出了runtime_error异常,接下来执行catch块内的语句。

    给用户的提示信息中输出了err.what()的返回值。what是runtime_error的一个成员函数。每个标准库异常都定义了名为what的成员函数,这些函数没有参数,返回值是C风格的字符串。

    标准异常

    image-20210116151953049

  • 相关阅读:
    HTML5课程
    css3兼容代码
    动画
    css3学习笔记(一)
    3d旋转
    Windows安装IIS后,启动网站报错:不能在此路径中使用此配置节……
    AngularJs1.X学习--路由
    Angular学习笔记 ——input 标签上的【name属性】和【ngModelOptions属性】
    Angular学习笔记【ngx-bootstrap】中的 tabset
    TFS 签入时,提示“变更集注释策略 中的内部错误……”
  • 原文地址:https://www.cnblogs.com/lihello/p/14286088.html
Copyright © 2011-2022 走看看