提问者:小点点

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


像在Go中那样将错误返回给调用方函数被认为是一种好的做法吗,还是我的程序在遇到错误时应该抛出一个错误呢?


共2个答案

匿名用户

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

  • 返回状态/错误代码而不是结果。
  • 仅返回结果,错误时引发异常。
  • 返回值或错误对象,如std::expected.

这些都有利弊。 最重要的是在您的程序中保持一致,并且与调用您的函数的任何人协调*-以便您满足他们的需求。

有关当前选项和未来潜在替代方案的详细介绍,请参阅本次按品牌&; Nash在C++年度会议CPPCON上:

CppCon 2018:“什么可能会出错?:期望与例外的故事”

匿名用户

这取决于你的观点。 有些人通过抛出异常来发誓,有些人会指出以下几点:

C++被设计成支持零开销的无异常操作,其结果是抛出代码路径被更多地涉及到。 异常在抛出时异常缓慢。 因此,至少应该避免在性能关键代码路径中抛出异常。

反对异常的另一个论点是,正确的错误处理和其他任何事情一样都是一个代码特性,并且它有助于使错误代码路径显式化。

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

作为一个推论,为使用异常而编写的代码与避免异常的代码不能很好地混合。 后者将不会以异常安全的样式编写,因此当异常跳过其执行的部分时,它就会在您面前崩溃。

对不起,我不知道使用异常的任何好的论据。 我所看到的所有论据(“它使代码更干净”之类的)似乎并没有真正地削减它,我不知道。 关于使用异常的论点,请参考一些异常狂热者。

底线:
有许多项目完全包含异常,还有一些项目在代码中禁止异常。 因为这两个阵营的代码不能很好地混合,所以你需要坚持你正在工作的项目是如何做到的。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|返回|调用|抛出|一种|做法)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?