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

标签 c++ exception

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

有什么能阻止我创建自己的空“标签类”吗?

class out_of_bounds_access {}; // or:
class memory_leak {};

然后扔那个?
毕竟,大多数情况下,是类名携带了有关出错的信息,而不是异常类的成员。

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

附言我知道在某些情况下,“定制的”异常携带信息,后者用于确定解决问题的正确方法......
然而,如果你仔细想想,像这样的情况可以经常(不总是,但经常)被重新处理以抛出和捕获多个不同的标签类,而不是只有一个标签类(带有“内容”)。

最佳答案

不,没有什么能阻止你这样做。

但是,一些想要捕获“任何异常”的代码将捕获 const std::exception&,如果您的异常类型不是从 std::exception 派生的> 那将行不通。

当然,我们可以捕获 ...,但根据我的经验,这被用作避免由于未捕获的异常而终止的最后一道“钝器”,并且不能告诉你关于异常本身的任何事情。

Boost 异常不是从 std::exception 派生的,它真的很烦人

为什么不让所有异常成为这个标准层次结构的一部分?

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

关于c++ - 当前形式的 `std::exception` 是多余的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53593701/

相关文章:

c++ - 为什么 OpenCV 拒绝 cvLoadImage ("string.ext"),但接受 cvLoadImage(argv[1])?

c++ - 如何指示命名空间仅供库使用?

c++ - VS C++ 程序仅在从文件夹运行 .exe 时才有效? [不是VS调试]

c# - 为什么 try-catch block 无法处理异常?

javax.mail.Transport.send0() 不会抛出它所 promise 的异常

c++ - 为什么 `throw MyClass' 不起作用而 `throw MyClass()' 起作用?

c++ - 正则表达式值到字符串

python - 如何在 scipy.spatial.qhull.Delaunay 中禁用控制台输出异常?

java - 为什么不推荐错误处理?

c++ - Visual Studio 2010 & 2008 无法处理不同文件夹中同名的源文件?