C++异常是对程序运行过程中发生的异常情况(如被0除)的一种响应。异常提供了将控制权从程序的一个部分传递到另一部分的途径。
1、对异常的处理有3个部分组成:
(1)引发异常
(2)捕获有处理程序的异常
(3)使用try块
C++异常的简单例子:
double hmean(double a,double b) { if (a == -b) throw "bad hmean() arguments: a = -b not allowed";//引发异常 return 2.0 * a * b / (a + b); } void test_exception() { double x, y, z; cout << "Enter two number:"; while (cin >> x >> y) { //使用try catch进行异常捕获和处理 try { z = hmean(x,y); } catch (const char * s) { cout << s << endl; cout << "Enter a new pair of numbers:"; continue; } cout << "Result:" << z << endl; cout << "Enter next two numbers:"; } cout << "Quit"; }
运行情况如下:
异常类型可以是字符串或其他C++类型,通常为类类型。
将类对象作为异常类型的例子:
class bad_hmean { private: double v1; double v2; public: bad_hmean(int a = 0, int b = 0) :v1(a) ,v2(b) { } void mesg() { cout << "hmean(" << v1 << "," << v2 << "):" << "Invalid arguments: a = -b "; } }; //使用异常规范对函数定义进行限定,指出它将引发那些类型的异常 double hmean(double a,double b) throw(bad_hmean) { if (a == -b) throw bad_hmean(a,b);//引发异常 return 2.0 * a * b / (a + b); } void test_exception() { double x, y, z; cout << "Enter two number:"; while (cin >> x >> y) { //使用try catch进行异常捕获和处理 try { z = hmean(x,y); } catch (bad_hmean & bh) { bh.mesg(); cout << "Enter a new pair of numbers:"; continue; } cout << "Result:" << z << endl; cout << "Enter next two numbers:"; } cout << "Quit"; }
2、exception异常类
在C++中,exception通常作为其他异常类的基类
C++基本异常类的层次结构:
exception:
--logic_error (典型的逻辑错误)
domain_error (参数不在定义的范围)
invalid_argument (非法的参数)
length_error (没有足够空间来执行所需操作)
out_of_bounds (索引错误)
--runtime_error (运行期间发生但难以预计和防范的错误)
range_error
overflow_error
underflow_error
--bad_alloc 内存分配导致的异常
如果上述异常类,无法满足要求,应当从logic_error 或runtime_error派生一个异常类,以确保自定义的异常类可以归入同一个继承层次结构中。
关于异常需要注意的地方:
(1)异常规范不适用于模版,因为模版函数引发的异常可能随特定的具体化而异。
(2)异常处理虽然很重要,但会增加编程的工作量,增大程序,降低程序的速度。