开发工具可否应用(开发的工具)
924
2022-05-29
1.导致异常的原因
异常可能是外部因素导致的,如系统没有足够的内存;也可能是应用程序内部因素导致的,如使用的指针包含无效值或除数为零。为向调用者指出错误,有些模块引发异常。
异常会打断应用程序的正常流程。毕竟,如果没有内存可用,应用程序就无法完成分配给它的任务。然而应用程序可处理这种异常:向用户显示一条友好的错误消息,采取必要的挽救措施并妥善地退出。
2.使用try和catch捕获异常
要捕获语句可能引发的异常,可将它们放在try块中,并使用catch块对try块可能引发的异常进行处理,语法如下:
void Func() { try { int* pNumber = new int; *pNumber = 999; delete pNumber; } catch(...) { cout<<"Exception in Func, quiting"<
1
2
3
4
5
6
7
8
9
10
11
12
13
(1)使用catch(…)处理所有异常
成功分配内存时,默认形式的new返回一个指向该内存单元的有效指针,但失败时引发异常。下面将演示如何捕获使用new分配内存时可能引发的异常,并在计算机不能分配请求的内存时进行处理。
#include
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
在此程序中,如果键盘输入的Input为一个负数,这显然不符合要求。如果没有异常处理,该程序将以讨厌你的方式终止。但由于有异常处理程序,程序将显示一条友好的消息:Got to end, sorry!结束程序。
(2)捕获特定类型的异常
一般的异常的类型是已知的,为了查明导致异常的原因,执行更有针对性的清理工作,或者至少是向用户显示一条提示消息,这时就可以选择捕获这种类型的异常。
其实上面(1)中的程序,当键盘输入指定存储的个数为负数时,将导致引发异常,而该异常类型为std::bad_alloc。
下面程序将演示捕获std::bad_alloc类型的异常:
#include
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
3.使用throw引发特定类型的异常
在上面演示的程序中,捕获std::bad_alloc时,实际上是捕获new引发的std::bad_alloc类对象。你也可以引发自己选择的异常,为此只需要使用关键字throw。语法如下:
void Func()
{
if(case_unwanted)
throw Value;
}
当做除法运算时,若除数为0将导致程序异常。下面将演示如何使用throw引发这种自定义异常:
#include
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
26
27
28
29
注意:上述代码没有将整个main()都放在try{}中,而只在其中包含可能引发异常的代码。提倡这种做法,因为异常处理也可能降低代码的执行性能。
4.std::exception类
捕获std::bad_alllocl类型异常时,实际上是捕获new引发的std::bad_alloc对象。std::bad_alloc继承了C++标准类std::exception,而使用exception类时,需要添加头文件:#include
从std::exception派生出来的几个重要的异常类:
bad_alloc: 使用new请求内存失败时引发
bad_cast: 试图使用dynamic_cast转换错误类型时引发
ios_base::failure: 由iostream库中的函数和方法引发
std::exception是异常基类,定义了虚函数what(),用来描述导致异常的原因。
因为std::exception是众多异常类型的基类,所以所有将std::exception作为基类的异常,均可使用catch(const exception&)捕获:
void Func() { try { // code made exception safe } catch(const std::exception& exp) { cout<<"导致异常的原因是:"<
1
2
3
4
5
6
7
8
9
10
11
从std::exception派生出自定义异常类
让自定义异常继承std::exception的好处在于,现有的异常处理程序catch(const std::exception)不但能捕获bad_alloc、bad_cast等异常,还能捕获自定义异常,因为它们的基类都是exception。
下面将演示继承std::exception的CustomException类:
#include
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
C++
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。