Skip to content

编写自己的异常类

为什么要编写自己的异常类?

  1. 标准库中的异常是有限的;
  2. 在自己的异常类中,可以添加自己的信息。(标准库中的异常类值允许设置一个用来描述异常的字符串)。

如何编写自己的异常类?

  1. 建议自己的异常类要继承标准异常类。因为C++中可以抛出任何类型的异常,所以我们的异常类可以不继承自标准异常,但是这样可能会导致程序混乱,尤其是当我们多人协同开发时。
  2. 当继承标准异常类时,应该重载父类的what函数和虚析构函数。
  3. 因为栈展开的过程中,要复制异常类型,那么要根据你在类中添加的成员考虑是否提供自己的复制构造函数。
cpp
#include <iostream>
using namespace std;

//自定义异常类
class MyOutOfRange : public exception {
public:
    MyOutOfRange(const string errorInfo) {
        this->m_Error = errorInfo;
    }

    MyOutOfRange(const char *errorInfo) {
        this->m_Error = string(errorInfo);
    }

    virtual ~MyOutOfRange() {
    }
    virtual const char *what() {
        return this->m_Error.c_str();
    }

    string m_Error;
};

class Person {
public:
    Person(int age) {
        if (age <= 0 || age > 150) {
            //抛出异常 越界
            //cout << "越界" << endl;
            //throw  out_of_range("年龄必须在0~150之间");

            //throw length_error("长度异常");
            throw MyOutOfRange(("我的异常 年龄必须在0~150之间"));
        } else {
            this->m_Age = age;
        }
    }

    int m_Age;
};


void test() {
    try {
        Person p(151);
    } catch (out_of_range &e) {
        cout << e.what() << endl;
    } catch (length_error &e) {
        cout << e.what() << endl;
    } catch (MyOutOfRange e) {
        cout << e.what() << endl;
    }
}

int main(int argc, char *argv[]) {
    test();

    return 0;
}

程序输出:

shell
我的异常 年龄必须在0~150之间