自定義異常類
盡管C++預定義了很多標准異常類,但可能還是無法滿足我們的需求,這時候我們可以自定義異常類來描述異常。當然,如果使用C++定義的異常類就可以滿足,那么盡量使用C++定義的異常類,而避免創建自己的異常類。
異常類同一般的C++類沒什么區別,除了它派生自exception類或者其派生類(如runtime_error等),這樣我們就可以使用exception類中的一些公共特性如what函數等。
如一個圓的半徑不應該小於或者等於0,所以我們可以定義一個CircleException類,繼承自logic_error類。
首先是CircleException.h文件,為了方便,我們直接實現了類而沒有進行分離
#ifndef CIRCLEEXCEPTION_H
#define CIRCLEEXCEPTION_H #include <stdexcept> using namespace std; class CircleException: public logic_error { public: CircleException(double radius): logic_error("Invaild circle") { this->radius = radius; } double getRadius() const { return radius; } private: double radius; }; #endif // CIRCLEEXCEPTION_H
在Circle.h文件中導入CircleException.h文件
#ifndef CIRCLE_H
#define CIRCLE_H #include "GeometricObject.h" #include "CircleException.h" #include <string> using namespace std; class Circle: public GeometricObject { public: //無參構造函數 Circle(); //有參構造函數,半徑為radius,顏色為color Circle(const double radius, const string& color); //其他的屬性和操作無需再寫一遍,因為繼承了GeometricObject類 //如果有需要可以再添加屬性和方法等如下面的radius //獲取圓的半徑 double getRadius() const; string getColor() const; double getArea() const; string toString() const; private: //圓的半徑 double radius; }; #endif // CIRCLE_H
接下來修改Circle.cpp文件,在有參構造函數中拋出異常CircleException
#include "Circle.h" using namespace std; Circle::Circle(){ this->radius = 1; this->color = "white"; } Circle::Circle(const double radius, const string& color) { if(radius <= 0) { throw CircleException(radius); } this->radius = radius; this->color = color; } double Circle::getArea() const { return radius*radius*3.14; } double Circle::getRadius() const { return radius; } string Circle::getColor() const { return color; } string Circle::toString() const { return "Circle Object"; }
接下來main函數進行測試
#include <iostream>
#include "Circle.h" using namespace std; int main(){ try{ Circle circle(-1, "white"); }catch(CircleException& e){ cout << e.what() << endl; cout << "半徑為" << e.getRadius() << endl; } return 0; }
運行結果:
我們不但處理了異常,並且傳遞了更多的信息如圓的非法半徑,這就是使用異常類的好處。