前言
建议看书的时候就看一下异常,其它的直接跳过
一、简单语句
一条表达式语句以;
结尾,它的作用是执行表达式并丢弃掉求值结果。一行如果只有一个;
也是一条语句,称为空语句。复合语句时用{}
括起来的语句或者声明, 也称为块,第二章在作用域有提到一个块就是一个独立的作用域。如果一个{}
里面什么也没有,称为空块。
条件语句注意事项
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
对象,不能给这些对象赋予初始值。