前言
建议看书的时候就看一下异常,其它的直接跳过
一、简单语句
一条表达式语句以;结尾,它的作用是执行表达式并丢弃掉求值结果。一行如果只有一个;也是一条语句,称为空语句。复合语句时用{}括起来的语句或者声明, 也称为块,第二章在作用域有提到一个块就是一个独立的作用域。如果一个{}里面什么也没有,称为空块。
条件语句注意事项
if else尽量把{}带上,免得出bug不好找switch case中,不能在某个case块中定义变量,因为如果该变量在后续的case中有使用,就会发生编译错误。do while和while的区别在于前者先执行循环体再检测条件,后者反之。所以do while不管怎样都会进行一次循环。
二、异常
C++中的异常处理有三种:1)throw表达式:引发异常;2)try catch:try中抛出的异常会被catch中的代码进行处理;3)异常类:用于在throw和catch之间传递异常的具体信息。
throw表达式
举一个经典的除数不为0 的例子,当输入的除数为0时,通过throw引发异常。这里引发的异常并没有被处理
int a, b;
cin >> a >> b;
if (b != 0) {
cout << "a / b = " << a / b << endl;
} else {
throw runtime_error("除数不能为0!!!");
}
try catch
try后面可以跟多个catch块,以处理多个不同类型的异常。结合上面throw引发的异常,通过catch进行处理。
try {
if (b != 0) {
cout << "a / b = " << a / b << endl;
} else {
throw runtime_error("除数不能为0!!!");
}
} catch (runtime_error e) {
cout << e.what() << endl; // 处理异常
}

当一个异常被抛出时,寻找处理异常代码的过程与函数调用链相反。首先会去引出异常的函数寻找处理代码,如果没有,再去调用函数的函数寻找代码被且终止最初引发异常的函数,如果当前的函数也没有,就去找下一个调用当前的函数的函数中是否有异常处理代码,一直循环,直到没有找到任何处理函数,那么程序最终会转到名为terminate的标准款函数。执行了该函的程序都是非正常退出。如果一开始就没有定义try catch,那么当抛出异常时就会直接转到terminate函数。
标准异常
C++定义了一组异常库,熟悉并使用这些内置的异常信息可以让程序更加的完善。以下是定义异常类的4个头文件
-
exception定义最通用的异常类,它只报告异常的发生,不提供任何额外信息。 -
stdexcept定义了常用的几种异常。如下。
-
new头文件定义了bad_alloc,后面章节会介绍 -
type_info定义了bad_cast异常类型
头文件定义了bad_alloc,后面章节会介绍
-
type_info定义了bad_cast异常类型 在上面的这些异常类中,我们只能以默认初始化的方式初始化
exception、bad_alloc和bad_cast对象,不能给这些对象赋予初始值。


















