繁体   English   中英

C ++异常规范替换

[英]C++ exception specification replacement

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

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

(一些参考: 12 ,等)

我还没有理解的是如何更换它。 我如何告诉f()的调用者他必须捕获异常?

怎么样

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

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

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

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

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

您可以使用自动文档工具替换它。

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

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

有关更多有用信息,请参阅此问题: 如何记录函数可能抛出的所有异常?

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

您认为调用者必须捕获异常表示您的设计可能存在问题。 您是否使用例外来表示非特殊情况,例如文件结尾?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM