赞
踩
1.C语言对于异常的处理:
- 方法一:在之前我们遇到一些bug的时候,通常会用
if
判断或者assert
断言等问题进行处理。但这种方式太过暴力,会直接中断程序的运行- 方法二:返回错误码,C语言的报错大多使用这种方式。不过这需要程序的用户自己去查对应的错误码表格,较为麻烦
2.C++对于异常的处理:
- C++标准库中便使用了一个
exception
类来进行异常的处理,我们运行程序中遇到的一些报错,其实就是标准库里面抛出了对应的异常其操作主要借助下面三个关键字:
- throw:在出现问题的地方抛出异常(throw关键字可以抛出
任意类型
的异常)- try:监控后续代码中出现的异常,后续需要以catch作为结尾
- catch:用于捕获异常,同一个try可以用多个不同类型的catch进行捕获
int Div() { int a, b; cin >> a >> b; if (b == 0) throw "div 0 err!"; return a / b; } int main() { try { cout << Div() << endl; } catch(const char* s) { cout << s << endl; } return 0; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
我们在进行异常处理的时候需要注意三点,否则容易出问题:
catch类型对应
当我们进行抛异常的时候,一定需要有对应类型的catch,否则会报错
比如我们
throw
的是一个常量字符串
,如果用string
来catch,就会因为类型不匹配而出现报错
- 所以当我们使用某一个会抛异常的函数的时候,一定要注意其抛出异常的类型
利用…进行全捕获
假设我们不知道这里面会抛出什么类型的错误呢?总不能把所有类型都catch一下吧?
当然不需要,我们可以使用下面的函数进行全捕获
- 这就可以用于当我们不知道报错类型的时候。不过一般的使用场景是,在这之前先
catch
已知的错误类型,最后再加上一个全捕或,作为未知错误
的标识
- 不过
catch(...)
有一个缺点,那便是我们不能知道异常的类型
基类捕获派生类的异常
当我们出现异常的时候,如果
throw
了一个子类对象,可以用基类的引用来接收!这个在进行继承多态的错误编写的时候就很有用
class A { int a; }; class B : public A { int b; public: B() :b(1) {
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。