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

时间:2013-12-19 13:22:24

标签: c++ c++11

如何处理失败的方法:

  1. 使用例外
  2. 使方法返回bool
  3. 第一种方法是在出现错误时抛出异常。 但有问题的代码需要放在try块中, 然后你需要编写catch块。

    您需要检查返回值的第二种方法 方法,然后做点什么。

    所以基本上不是同一个机制吗?你有两个部分: 发现出现问题,然后对此做些什么。 那么我使用哪种方法是否重要?

7 个答案:

答案 0 :(得分:4)

基本上,您可以使用这两种方法达到相同的行为,但Exception可以提供2个附加值:

1)您不必在精确调用方法中处理错误,它可以在调用堆栈的任何位置。如果您只想传递错误,请从代码中删除if(!doSomthing()) return false;

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

答案 1 :(得分:4)

例外的主要好处是它们是非本地的。您可以从抛出的位置捕获几个调用层的异常。这样,中间的代码不必关心异常(除了确保在展开期间进行适当的清理,即异常安全),这使得特殊情况不太可能被遗忘。但是这个好处是有代价的:堆栈展开比简单地返回一个值更复杂。在绩效方面,回报值方法通常更简单。

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

答案 2 :(得分:3)

没有简单的答案。例如,以下是文章C++ Exceptions: Pros and Cons

的结论
  

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

     

如果你有一个良好的开发过程和实际遵循的代码标准,如果你正在编写依赖RAII来为你清理资源的现代风格的C ++代码,如果你的代码库是模块化的,那么使用异常可能是一个好主意。

     

如果您正在使用未编写异常安全的代码,如果您认为开发团队缺乏纪律,或者您正在开发硬实时系统,则可能不应使用异常

答案 3 :(得分:3)

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

例如,当搜索 MUST 存在的文件时,找不到它会引发异常。但是,如果该文件可能存在,也可能不存在,那么找不到该文件并不例外,因此不需要例外。

答案 4 :(得分:3)

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

例外:

  • 稍微处理本地的详细信息
  • 如果无法在本地处理错误,则可以简单地忽略
  • 可以在静态(在异常类型中)和动态(在抛出的对象中)中携带关于错误的尽可能多的信息
  • 在某处需要处理程序以避免终止程序
  • 可能会有更多的运行时间开销(但是当没有任何东西被抛出时可能会少一些,具体取决于它们如何实现)
  • 要求代码为异常安全

返回值:

    如果不在本地处理,
  • 必须手动向上传递堆栈:如果忘记
  • 则容易出错
  • 具有固定类型,限制了它们可以携带的信息量(尽管您可以返回指向多态类型的指针,并处理相关的生命周期管理问题)
  • 如果函数还需要返回成功的话
  • ,那么
  • 很难使用

答案 5 :(得分:2)

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

答案 6 :(得分:0)

我更喜欢布尔。我会说它的个人偏好。 我发现它更容易阅读。