C++ primer plus--友元、异常和其他

15 友元、异常和其他

15.1 友元

(1)类并非只能拥有友元函数,也可以将类作为友元。

15.2 嵌套类

(1)在 C++ 中,可以将类声明放在另一个类中,在另一个类中声明的类称为嵌套类。

15.3 异常

(2)三个关键字:try catch throw

  • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。

  • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。

  • try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块

(2) 异常处理规则

throw 表达式

throw 可以抛出字符串语句或是其他各种基本类型、也可以是类。


try … catch 模块

try {
    语句组
}
catch(异常类型) {
    异常处理代码
}
...
catch(异常类型) {
    异常处理代码
}

try…catch 语句的执行过程是:

  • 执行 try 块中的语句,如果执行的过程中没有异常拋出,那么执行完后就执行最后一个 catch 块后面的语句,即所有 catch 块中的语句都不会被执行;
  • 如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行(称作异常被该 catch 块“捕获”),执行完后再跳转到最后一个 catch 块后面继续执行。

例如

#include 
using namespace std;
int main()
{
    double m ,n;
    cin >> m >> n;
    try {
        cout << "before dividing." << endl;
        if( n == 0)
            throw -1; //抛出int类型异常
        else
            cout << m / n << endl;
        cout << "after dividing." << endl;
    }
    catch(double d) {
        cout << "catch(double) " << d <<  endl;
    }
    catch(int e) {
        cout << "catch(int) " << e << endl;
    }
    cout << "finished" << endl;
    return 0;
}
  • 当 n 不等于 0 时,没有异常,catch 块不会执行;

  • 当 n = 0 时,抛出 -1(int 型异常),依次寻找匹配的 catch 类型,最终被 catch (int e) 语句捕获,输出 “catch(int)” 。

(3)

catch (...){
    ...
}

可以捕获所有异常。

注意:当前一个 catch块 捕获时,后面的 catch 即使也匹配,也不会执行。因此上述语句一般放在 catch 块最后。

你可能感兴趣的:(C++,c++)