【问题标题】:C++ exception specification replacementC++ 异常规范替换
【发布时间】:2013-01-14 13:59:46
【问题描述】:

经过一番阅读,我意识到,在 C++ 中,异常规范被认为是一件坏事:

int f() throw(A, B);  // bad because a lot of reasons

(一些参考:12 等)

我不明白的是如何替换它。我如何告诉f() 的调用者他必须捕获异常?

【问题讨论】:

  • 为什么调用者必须捕获异常。如果有异常,那么你只想抓住它,如果你能修复它,如果你能修复它,你就知道哪里出了问题。

标签: c++ exception


【解决方案1】:

怎么样

 //throws: A if something is wrong
 //        B if something else is wrong
 int f();

【讨论】:

  • 删除了我的回答以尊重你的回答。
【解决方案2】:

你没有。什么都不说意味着它可以抛出任何东西。

我假设你有一些 Java 背景来问这个问题。编译时异常检查是一个失败的 Java 实验。这就是为什么您在其他任何地方都看不到它。

异常处理的一般规则是:尽可能处理。这通常归结为某个非常高级别的try-catch,您基本上会告诉用户他试图做的任何事情都失败了。能够从异常中恢复并继续操作是非常罕见的。

当然,您应该提供文档说明您的函数会抛出哪些异常。我不认为这可以替代 throw 规范(其目的非常不同)。您应该记录您的函数抛出的异常并且可以由调用者有意义地处理,而抛出规范必须列出任何可能的异常来自这个函数(以及它调用的函数)。

【讨论】:

  • 这意味着必须始终使用try/catch?如果我调用一个泛型函数,我必须捕获一个泛型异常?
  • @ital 如果你想处理异常,是的。但是您可能希望让它传播并在另一个级别进行处理。
  • 我认为将 Alex 的答案和 Luchian 的答案结合起来是最好的方法;记录你可以但试图强制调用者处理你的异常是不好的juju。
【解决方案3】:

您可以将其替换为自动文档工具。

此类工具通常能够很好地格式化方法将抛出的异常,例如 doxygen \exception 命令(或 \throw 或 \throws)。假设您的代码的用户阅读了文档,他们将能够找出要捕获的异常。

/** 
 * @exception A 
 * @exception B
 */
int f();

有关更多有用信息,请参阅此问题:How to document all exceptions a function might throw?

【讨论】:

    【解决方案4】:

    我如何告诉 f() 的调用者他必须捕获异常?

    你认为调用者必须捕获异常表明你的设计可能有问题。您是否使用异常来表示非异常情况,例如文件结束?

    强制直接调用者捕获所有可能的异常是糟糕的设计。示例:标准库容器的push_back 成员函数分配内存,这可能会失败。库的设计者不希望调用者将每个push_back 包装在try/catch 块中。这没有意义。这样做会使代码更难看,更难测试。此外,您将如何从内存不足的情况中恢复?处理一次,在高层次上,你能做的就差不多了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 2015-04-08
      • 2012-05-21
      • 2018-10-30
      相关资源
      最近更新 更多