将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法



像在 Go 中那样向调用函数返回错误是否被认为是好的做法,还是我的程序在遇到错误时应该抛出错误?

C++中有不同的常见做法 w.r.t. 错误处理 - 因为它是一种多范式语言。例如:

  • 返回状态/错误代码而不是结果。
  • 仅返回结果,出错时抛出异常。
  • 返回值或错误对象,例如 std::expect。

这些中的每一个都有优点和缺点。最重要的是在你的程序中保持一致,并与调用你的函数*的人协调- 以便你满足他们的需求。

有关当前选项和未来潜在替代方案的详细介绍,请参阅Brand & Nash在年度C++会议上的演讲 CppCon:

CppCon 2018:"什么可能出错?:期望和例外的故事">

取决于你的观点。有些人通过抛出例外来发誓,其他人会指出以下一些:

C++ 旨在支持零开销的无异常操作,因此抛出代码路径涉及更多。引发异常时异常缓慢。因此,至少应避免在性能关键型代码路径中引发异常。

反对异常的另一个论点是,正确的错误处理与其他任何功能一样具有代码功能,并且它有助于明确错误代码路径。

反对异常的第三个论点是,C++被设计为允许重载任何运算符,允许像a = b;这样的简单语句抛出。因此,如果程序中允许异常,则编写为使用异常的代码必须以特殊的异常安全方式编写(在局部变量中构造并swap()提交更改(。

作为推论,为使用异常而编写的代码根本无法与避免异常的代码很好地混合在一起。后者不会以异常安全样式编写,因此当异常跳过其部分执行时,它会在您的脸上爆炸。


抱歉,我不知道使用异常的任何好论据。恕我直言,我看到的所有论点("它使代码更干净"之类的(似乎并没有真正削减它。请参考一些异常爱好者了解使用异常的论据。


底线:
有许多项目完全接受例外,还有其他项目禁止它们进入代码。而且由于这两个阵营的代码不能很好地混合,因此您需要坚持您正在处理的项目是如何完成的。

相关内容

最新更新