为什么throw一个类出来,这个类是继承于Exception,能被捕获

. 异常类继承关系

class Exception {
private:
    string error;

public:
    virtual string getError();
    virtual void setError(string e);
    virtual string toString();
    Exception();
};

class ZeroException : public Exception {
public:
    ZeroException() {
        setError("the divisor is zero!");
    }
};

class InputException : public Exception {
public:
    InputException() {
        setError("the input number is negative error!");
    }
};

class NoTriangleException : public Exception {
public:
    NoTriangleException() {
        setError("Three numbers cannot form a triangle!");
    }
};
  • ZeroExceptionInputExceptionNoTriangleException 都是 Exception 的子类,它们继承了 Exception 类中定义的虚函数,包括 toString()
  • 当在 Triangle 类的构造函数中抛出这些异常时,它们会被作为 Exception 类型的对象抛出。由于它们是 Exception 类的子类,因此可以通过 Exception& 类型的引用捕获。

2. 异常的捕获和处理

main 函数中的异常处理部分:

int main(int argc, char* argv[]) {
    double t1, t2, t3;
    cin >> t1 >> t2 >> t3;
    try {
        Triangle tri(t1, t2, t3); // 可能会抛出 ZeroException、InputException 或 NoTriangleException
        cout << "area=" << tri.area();
    }
    catch (Exception& e) { // 捕获所有继承自 Exception 的异常
        cout << e.toString(); // 调用 toString() 打印异常信息
    }
    return 0;
}
  • catch (Exception& e):这里使用了基类 Exception 的引用来捕获异常。由于 ZeroExceptionInputExceptionNoTriangleException 都是 Exception 的子类,因此当抛出的异常类型是这些子类时,可以被 Exception& 类型的引用捕获。
  • 在捕获到异常后,通过调用 e.toString() 可以获取异常对象的描述信息,这是因为 toString() 是虚函数,能够在运行时根据对象的实际类型来调用相应的实现。

因此,通过这种继承和多态的设计,你可以在捕获异常时,根据具体的异常类型来处理不同的异常情况,并且能够统一地使用基类 Exception 的接口来获取异常信息,使得异常处理更加灵活和可维护。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值