C++快速入门 第三十二讲:assert函数和捕获异常

发布时间 2023-08-18 15:12:15作者: 一杯清酒邀明月

C语言和C++都有一个专门为调试而准备的工具函数---assert函数。这个函数是在assert.h库文件里定义的。

实例1:assert函数应用

 1 #include <cassert>
 2 //assert()函数需要有一个参数,它将测试这个输入参数的真或者假状态
 3 //如果为真  Do nothing
 4 //如果为假  Do something 
 5 int main()
 6 {
 7     int i = 20;
 8     assert( i == 65);//如果括号内为真,则过;假则中断程序 
 9     
10     return 0;
11  } 

同样为了对付潜在的编程错误(尤其是在运行时的错误),捕获异常是一种完全不同的方法。简单说,异常就是与预期不相符合的反常现象。

注:每条try语句至少要有一条配对的catch语句。必须定义catch语句以便让它接收一个特定类型的参数。

当某个try语句块里执行过throw语句,它后面的所有语句(截止到这个try语句块末尾)将永远不会被执行。

如果try语句块无法找到一个与之匹配的catch语句块,它抛出的异常将中止程序的执行。

实例2:捕获异常(try,catch,throw)

 1 #include <iostream>
 2 #include <climits>
 3 
 4 using namespace std;
 5 unsigned long returnFactorial(unsigned short num) throw(const char*);
 6 
 7 int main()
 8 {
 9     unsigned short num = 0;
10     cout << "请输入一个整数:";
11     while( !(cin>>num) || (num < 1) )
12     {
13         cin.clear();//清楚状态
14         cin.ignore(100,'\n'); //清除缓存区
15         cout << "请输入一个整数:"; 
16     }
17     cin.ignore(100,'\n');
18     try
19     {
20         unsigned long factorial = returnFactorial(num);//如果异常,则抛出字符型的*e异常
21                                                        //直接跳转到catch继续执行 
22         cout << num << "的阶乘值是:" << factorial;
23     }
24     catch(const char *e)//如果正常则不执行,抛出异常则执行 
25     {
26         cout << "error";
27     }
28     return 0;
29 }
30 
31 unsigned long returnFactorial(unsigned short num) throw(const char*)
32 {
33     unsigned long sum = 1;
34     unsigned long max = ULONG_MAX;
35     
36     for(int i = 1;i <= num; i++)
37     {
38         sum *= i;
39         max /= i;
40     }
41     if(max < 1)
42     {
43         throw"悲催。。。该基数太大,无法在该计算机计算求出阶乘值。\n";
44     }
45     else
46     {
47         return sum;
48     }
49 }