定义自己的异常类的最佳实践?

时间:2009-03-27 03:37:54

标签: c++ exception inheritance error-handling

我有一些特殊的异常情况,我想抛出并捕获,所以我想定义自己的异常类。

最佳做法是什么?我应该继承std::exception还是std::runtime_error

5 个答案:

答案 0 :(得分:25)

是的,std::runtime_errorstd::logic_error std::invalid_argumentstd::exceptioninherit是好的做法,具体取决于哪种例外情况是

如果所有异常都从catch(const std::exception &e) {...}以某种方式继承,则很容易通过{{1}}捕获所有常见错误。如果你有几个独立的层次结构,这会变得更加复杂。从专门的异常类派生会使这些异常带来更多信息,但这实际上有多大取决于您如何处理异常。

答案 1 :(得分:6)

我不是C ++开发人员,但我们在C#代码中做的一件事是为我们的框架创建一个基类异常,然后记录构造函数中抛出的异常:

  public FrameworkException(string message, Exception innerException)
      : base(message, innerException)
  {
      log.Error(message, innerException);
  }

  ...

任何派生异常只需要调用它的基本构造函数,我们就可以获得一致的异常日志记录。没什么大不了的,但很有用。

答案 2 :(得分:3)

在某个范围内放置异常是一件好事。例如,类操作可以在异常类中声明Error。

并像

一样抓住他们
catch ( const Manipulation::InputError& error )
catch ( const Manipulation::CalculationError& error )

在这种情况下,它们可以只是空类,没有任何其他错误信息,除非你设计允许这些异常在你捕获所有标准异常的地方飞得很高。

答案 3 :(得分:1)

在我看来,如果你从std :: exception继承并不重要。对我来说,定义例外最重要的是:

  1. 让异常类名称有用且清晰。
  2. 当函数或类方法抛出异常时,清楚地记录(编写注释)。在我看来,这是异常处理中最大的失败点。

答案 4 :(得分:1)

它没有太大区别,因为std::runtime_error也继承自std::exception。您可能会认为运行时错误传达了有关异常的更多信息,但实际上,人们通常只是从基类异常类派生出来。