当前形式的`std :: exception`是多余的吗?

Pat*_*ykB 9 c++ exception

通常,当我想创建自己的异常时,我继承自std::exceptionstd::runtime_error.

是否有什么阻止我创建自己的空"标签类"?

class out_of_bounds_access {}; // or:
class memory_leak {};
Run Code Online (Sandbox Code Playgroud)

并抛出那个?
毕竟,大多数情况下,它是带有关于错误的信息的类名,而不是异常类的成员.

好的,所以我认为这是一个坏主意,但为什么呢?为什么这是一个坏主意?

PS我知道有些情况下"定制"异常带有后者用于确定解决问题的正确方法的信息......
但是,如果你考虑一下,这样的情况可能很常见(并非总是如此) ,但经常),重新完成抛出和捕获多个不同的标记类而不是只有一个(带有"内容").

Lig*_*ica 26

不,没有什么能阻止你做这件事.

但是,一些想要捕获"任何异常"的代码将会捕获const std::exception&,如果您的异常类型不是std::exception从那时派生的,则无效.

当然,我们可以接受,...但根据我的经验,这是用作避免由于未捕获的异常而终止的最后一个"钝器",并且无法告诉您有关异常本身的任何信息.

提升异常并非源自,std::exception而且真的很烦人.

为什么不将所有异常作为此标准层次结构的一部分?

如果你不打算让你的异常类型一直到顶部,那么这里可能没有实际问题.但是,为什么要冒这个机会呢?通过添加: std::runtime_error或者某些东西你没有任何损失,你传递给基础的文本字符串是诊断程序员的有用信息.

  • tl; dr:使用std :: exception的好处是我将能够批准你的pull请求;) (5认同)
  • "Boost异常不是来自`std :: exception`而且它真的很烦人." - 您打算使用[`boost :: throw_exception`](https://www.boost.org/doc/libs/1_61_0/libs/exception/doc/throw_exception.html)来启用"正常"捕获: "发出的异常可以被截取为`E&`,`std :: exception&`或`boost :: exception&`."; 我不是在捍卫设计决定,但他们确实有一些"修复"东西的魔力. (5认同)
  • @ArneVogel啊,笨蛋.你认为在我的旧公司提出一个错误为时已晚吗?:d (4认同)
  • @LightnessRacesinOrbit取决于*如何*旧.这是后网络泡沫破灭,对吧?;-) ... @ cukier9a7b5:顺便说一句,除了`ex.what()`你还可以使用`typeid(ex).name()`,这将为你提供最派生对象的错位类型名称(因为`std :: exception`有虚方法).这至少对调试日志记录很有用.从理论上讲,你甚至可以拥有处理程序的关联容器(键入`std :: type_index`) - 但不要过度设计它. (3认同)