std :: exception:使用虚拟函数和继承与变量

时间:2018-06-27 09:47:52

标签: c++ exception virtual-functions c++-standard-library

设计std::exception以创建新的异常类型的原因是什么?要创建一个派生类来覆盖virtual what()函数,而不是创建一个可以容纳异常的类。字符串并返回到what()上?

class exception
{
    std::string msg;
public:
    exception(std::string _msg) : msg(_msg) {}
    void set(std::string _msg) { msg = _msg; }
    std:string what() { return msg; }
};

每个错误(bad_alloc, logical_error ...)可能是该类的一个实例,而不是派生类。

使用虚拟函数和继承而不是上述方法的原因是什么?

2 个答案:

答案 0 :(得分:1)

catch块不能作为模板,这意味着必须指定异常隐式可转换的类型。

具有一个用于异常(function () { return new Promise((resolve, reject) => { try { fetch(URL, { method: METHOD, body: BODY }) .then((res) => res.json()) .then((json) => { resolve(json); }) .catch((res) => { reject(res); }) } catch (exception) { reject(exception); } }); } )的接口,可以捕获任何异常并获得错误消息,而无需了解或关心异常的真实类型。但是如果用户只想捕获那些异常,还可以让用户选择更精确的类型,例如std::exception

答案 1 :(得分:0)

两者都可以使用,而且效果很好。标准库使用这种方法对异常进行不同的“分类”。