抛出C++异常时要抛出什么?

25 c++ exception

这可能是一个愚蠢的问题,但在C++中,当我想抛出异常时......我该扔什么?

我应该抛出std :: exception,还是标准库保留的?或者我应该抛出一个字符串或int?或者我应该抛出我觉得合适的东西?

Ker*_* SB 31

抛出一个源自的类std::exception; 如果你#include <stdexcept>,你可以从一些现成的,有用的派生类中挑选.

派生std::exception允许您的处理程序遵循可识别的样式,因为您始终可以使用它.what()来获取文本消息.不要抛出原始类型,因为它们不带有语义信息.

  • 我会反驳(虽然几乎相同),在大多数情况下,人们应该从std :: runtime_error派生他们的异常(它本身恰好是从std :: exception派生的) (10认同)

sti*_*472 8

通常人们不会直接抛出std :: exception,原因很简单,因为它不存储任何错误消息.什么方法不会返回任何东西.我有时会对此感到困惑,因为MSVC为std :: exception中的一个接受字符串的参数化构造函数提供了非标准扩展.

您可以在现有的异常类中进行选择,例如std :: runtime_exception或定义您自己的异常类.这有些主观,但我建议将异常类的数量保持在最低限度,因为RAII可以消除很多需要拥有多个代码分支并捕获不同异常类型的块.通常,消息与符合RAII的代码相结合,足以从任何异常中优雅地恢复.

最后,为了类似的原因,我建议您从std :: exception继承的所有异常.如果可以避免,则不希望不同的异常类型使用许多不同的catch块来丢弃代码.尽可能地解决问题.