当前位置: 首页 > 文档资料 > C++大学教程 >

13.5 简单异常处理例例子:除数为 0

优质
小牛编辑
135浏览
2023-12-01

下面考虑一个简单异常处理例子。图 13.1 的程序用 try、throw 和 catch 检测除数为0的异常情况,表示并处理除数为0的异常。

1 // Fig. 13.1:fig13_01.cpp
2 // A simple exception handling example.
3 // Checking for a divide-by zero exception.
4 #include <iostream.h>
5
6 // Class DivideByZeroException to be used in exception
7 // handling for throwing an exception on a division by zero.
8 class DivideByZeroException {
9 public:
10 DivideByZeroException()
11 : message( "attempted to divide by zero" ) { }
12 const char *what() const { return message; }
13 private:
14 const char *message;
15 };
16
17 // Definition of function quotient, Demonstrates throwing
18 // an exception when a divide-by-zero exception is encountered.
19 double quotient( int numerator, int denominator )
2O {
21 if ( denominator == 0 )
22 throw DivideByZeroException();
23
24 return staticcast< double > ( numerator ) / denominator;
25 }
26
27 // Driver program
28 int main()
29 {
30 int nunber1, number2;
31 double result;
32
33 cout << "Enter two integers (end-of-file to end): ";
34
35 while ( cin >> number1 >> number2 ) {
36
37 // the try block wraps the code that may throw an
38 // exception and the code that should not execute
39 // if an exception occurs
40 try {
41 result = quotient( numberl, number2 );
42 cout << "The quotient is: "<< result << endl;
43 }
44 catch ( DivideByZeroException ex ) { // exception handler
45 cout << "Exception occurred: "<< ex.what() << '\n';
46 }
47
48 cout << "\nEnter two integers (end-of-file to end): ";
49 }
50
51 cout << endl;
52 return 0; // terminate normally
53 }

输出结果:

Enter tow integers (end-of-file to end); l00 7
The quotient is: 14.2857

Enter tow integers (end-of-file to end); 100 0
Exception occurred: attempted to divide by zero

Enter tow integers (end-of-file to end); 33 9
The quotient is: 3.66667

Enter tow integers {end-of-file to end):

图 13.1 简单的异常处理例子:除数为0的异常

第一个输出显示执行成功。第二个除数为0,程序发现错误并发出错误消息。

现在考虑main中的驱动程序。程序提示并输入两个整数。注意numbcr1和number2的局部声明。

然后程序继续执行try块,其中的代码可能抛出异常。注意try块中并没有显式列出可能造成错误的实际除法,而是通过quotient函数调用实际除法的代码。函数quotient实际抛出除数为0的异常对象,将在稍后介绍。一般来说,错误可能通过娜块中的代码体现,可能通过函数调用体现,也可能通过try块的代码中启动的深层嵌套函数调用体现。

try块后面是个catch块,包含除数为0的异常的异常处理器。一般来说,try块中抛出异常时,catch块捕获这个异常,表明符合所抛出异常的相应类型。图13.1中,catch块指定捕获DivideByZeroException类型的异常对象,这种对象符合函数quotient中抛出的异常对象。该异常处理器发出一个错误消息并返回,这里返回1表示因为错误而终止。异常处理器也可以更加复杂。

执行时,如果try块中的代码设有抛出异常.则立即跳过try块后面的所有catch异常处理器,执行catch异常处理器后面的第一条语句,图13.1中执行return语句,返回0表示正常终止。

下面看看DivideByZeroExeeption类和quotient函数的定义。在函数quotient中,if语句确定除数为O时.U语句体发出一个throw语句,指定异常对象的构造函数名。这样就生成DivideByZemEx~ption的类对象。try块之后的catch语句(指定类型DivideByZeroException)捕获这个对象。

DivideByZemExeeption类的构造函数只是将message数据成员指向字符串”Dividebyzero”。catch处理器指定的参数(这里为参数error)中接收抛出的对象,井通过调用public访问函数printMessage打印这个消息。

编程技巧 13.4
将每种执行时错误与相应命名的异常对象相关联能提高程序的清晰性。