C++ 如何处理失败的方法:使用异常或使方法返回bool?

C++ 如何处理失败的方法:使用异常或使方法返回bool?,c++,c++11,C++,C++11,如何处理失败的方法: 使用异常 使方法返回bool 第一种方法是当出现问题时抛出异常。 但是有问题的代码需要放在一个try块中, 然后需要编写catch块 第二种方法是检查 方法,然后做点什么 那么,基本上,这不是相同的机制吗?你有两个部分: 发现出了什么问题,然后采取行动。 那么我使用哪种方法有关系吗?我更喜欢bools。我想说是个人喜好。 我发现它更容易阅读。有两个主要区别:(a)调用代码更容易忽略布尔状态代码。(b) 异常提供的上下文不仅仅是false。您可以区分业务逻辑错误、I/O错误和

如何处理失败的方法:

  • 使用异常
  • 使方法返回bool
  • 第一种方法是当出现问题时抛出异常。 但是有问题的代码需要放在一个try块中, 然后需要编写catch块

    第二种方法是检查 方法,然后做点什么

    那么,基本上,这不是相同的机制吗?你有两个部分: 发现出了什么问题,然后采取行动。
    那么我使用哪种方法有关系吗?

    我更喜欢bools。我想说是个人喜好。
    我发现它更容易阅读。

    有两个主要区别:(a)调用代码更容易忽略布尔状态代码。(b) 异常提供的上下文不仅仅是
    false
    。您可以区分业务逻辑错误、I/O错误和输入验证错误等。

    基本上,您可以使用两种方法实现相同的行为,但异常可以提供两个附加值:

    1) 您不必在确切的调用方法中处理错误,它可以位于调用堆栈的任何位置。如果(!doSomthing())返回false,则删除


    2) 它允许您在一个
    try
    下编写一个代码块,并在一个
    catch
    块中处理该代码块下的所有错误。

    除异常外的主要好处是它们是非本地的。您可以在抛出异常的几个调用层之外捕获异常。这样,介于两者之间的代码就不必关心异常(除了确保在展开过程中进行适当的清理,即确保异常安全),这样就不太可能忘记异常情况。但这一好处是有代价的:堆栈展开比简单地返回值更复杂。就性能而言,返回值方法通常更简单


    所以我会用这些来选择:如果出于某种原因,处理问题的唯一合理位置是直接在调用函数的位置,并且如果您相当确定在任何情况下,每个调用方都将包含某种错误处理代码,并且不可能忘记这样做,那么返回值将是最好的。否则,我会选择一个例外。

    没有简单的答案。例如,这里是文章的结论

    “例外或错误代码”问题没有简单的答案。需要根据开发团队面临的特定情况做出决策。一些粗略的指导原则可能是:

    如果你有一个很好的开发过程和代码标准,实际上是在遵循,如果你写的是现代风格的C++代码,它依赖于RAII来清理资源,如果你的代码库是模块化的,那么使用异常可能是个好主意。 如果您使用的代码没有考虑异常安全,如果您觉得开发团队缺乏纪律,或者如果您正在开发硬实时系统,那么您可能不应该使用异常


    我个人的规则是,只有在出现异常情况时才提出异常情况(即问题可能根本没有出现时)。否则,我使用返回值(大多数情况下)


    例如,在搜索必须存在的文件时,如果找不到该文件,将引发异常。但是,如果该文件可能存在,也可能不存在,则未找到该文件并不例外,因此不需要异常。

    对于所有情况都没有答案。这两种方法各有优缺点:

    例外情况:

    • 在本地处理时会稍微冗长一些
    • 如果无法在本地处理错误,则可以直接忽略
    • 可以在静态(在异常类型中)和动态(在抛出的对象中)携带有关错误的任意信息
    • 需要某个处理程序以避免终止程序
    • 可能会有更多的运行时开销(但如果不抛出任何内容,则可能会有更少的运行时开销,具体取决于它们的实现方式)
    • 要求代码是异常安全的
    返回值:

    • 如果不在本地处理,则必须手动向上传递堆栈:如果忘记,则容易出现错误
    • 有一个固定的类型,限制它们可以携带多少信息(尽管您可以返回指向多态类型的指针,并处理相关的生存期管理问题)
    • 如果函数在成功时还需要返回某些内容,则使用起来会很尴尬

    实际上并非相同的机制。第一部分实际上可以告诉您确切的问题,以便您可以对其进行调查。返回布尔值只会告诉你它成功与否,而不会告诉你其他任何事情。@AliAlamiri这显然是一个没有实际意义的问题,因为你可以返回
    int
    @Andrey返回int值会告诉你什么问题?如果它可以在本地处理,那么它是相同的机制-调用方检测并处理失败。如果不能,那么调用方可以忽略一个异常,但必须向其调用方传递一个返回代码——这更容易出错。所以,这不能归结为个人偏好,好吧,争论。布尔是一个更简单的概念。如果使用返回,它是函数的一部分,您可以选择是否在此时处理异常。人们建议返回不提供信息,您可以选择是否提供信息,即如果(返回==false){print“error message”}。对于调试来说,将所有内容都放在同一个范围内也很方便,在返回后直接进行检查。在另一个层面上,比如@MvG,则表示声音过于复杂。本页的答案中已经提出了很多观点。您的版本适用于简单的情况。打印错误消息时