C++异常规范替换

ean*_*ang 2 c++ exception

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

int f() throw(A, B);  // bad because a lot of reasons
Run Code Online (Sandbox Code Playgroud)

(一些参考:1,2,等)

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

Luc*_*ore 7

怎么样

 //throws: A if something is wrong
 //        B if something else is wrong
 int f();
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 6

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

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

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

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

  • 我认为 Alex 的答案和 Luchian 的答案的结合是最好的方法;记录你可以的地方,但试图强迫调用者处理你的异常是不好的juju。 (3认同)
  • @ital如果你想处理异常,是的。但您可能希望让它传播并在另一个级别进行处理。 (2认同)