C++中的标准或自定义异常?

Dan*_*ica 19 c++ standards exception

对于库中的代码,是更好的做法是创建和抛出自定义异常类(库::例外),或只是抛出标准异常(runtime_error,invalid_argument等)?

peo*_*oro 27

通常更好地专门化(继承)标准异常并抛出它.

这样就可以通过捕获a来捕获它作为一般异常std::exception,但如果需要更专业的代码,也可以专门捕获自定义异常类型.

另请参阅此C++常见问题解答要抛出的内容.

  • 基本上没有比这更好的答案了.创建自己的自定义异常类,它继承自std :: runtime_error(已经从std :: exception继承).这样,您的客户可以选择捕获您的特定异常,或者只捕获std :: exception或std :: runtime_error. (4认同)

Phi*_*ipp 7

通常,您应该在stdexcept头或其子类中抛出类的实例.什么类确切有意义取决于具体问题.我认为抛出"类别类"的实例std::logic_error并且std::runtime_error很少有用,因为它们没有固有的含义; 它们用于区分可能发生异常的两种主要情况:

  • std::logic_error如果调用它,则应该由函数抛出子类,但不满足所有前提条件.例外是调用者的错误,因为它未能提供必要的前提条件.对于此类别,您通常必须在投掷和未定义的行为之间进行选择; 它是鲁棒性和有效性之间的权衡(例如std::vector::at()vs std::vector::operator[]..这些异常通常无法处理;它们是程序中的错误的结果.

  • std::runtime_error如果满足所有前提条件但函数不能满足后置条件或由于程序控制之外的原因而破坏不变量(例如,文件不存在,网络连接丢失或不够),则应由函数抛出子类内存可用).通常应该处理这些例外.

我认为可用的逻辑错误类(例如invalid_argument)通常足够好,因为如果它们被引发,代码通常必须被修复,并且没有理由进行复杂的处理例程.另一方面,标准库中的运行时错误类本质上不太灵活,主要涵盖标准库本身必须抛出异常的区域.对于您的应用程序,您几乎应该始终从这些运行时错误类继承.例如,管理操作系统资源X的类应该抛出一个X_creation_error继承自std::runtime_error构造函数无法分配资源的类.

多个虚拟继承通常对异常类很有用.您可以从特定于库的某些"标记类" 继承std::runtime_error或其他stdexcept类,以及从Boost.Exception库中boost::exception获得额外的好处.强烈建议使用Boost.Exception教程,特别是Exception类型作为简单的语义标记在异常类型中使用虚拟继承.