繁体   English   中英

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

[英]Best practices for defining your own exception classes?

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

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

是的,最好从std::runtime_error其他标准异常类 继承 ,如std::logic_errorstd::invalid_argument等,具体取决于它是什么类型的异常。

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

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

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

  ...

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

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

并抓住他们

catch ( const Manipulation::InputError& error )
catch ( const Manipulation::CalculationError& error )

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM