传播异常的异常注释

9
假设我有一个函数a,会抛出一个异常$e。因此,根据phpdoc的规定,我应该在a的定义上加上注释@throws
当我有另一个函数b调用a时,如果b没有适当地捕获和处理$e异常,那么这个异常将会继续向上传递,直到被最外层的代码块或全局异常处理器捕获并处理。
function b() {
   a();
}

b的定义上使用@throw注释表示b可能抛出该异常,这是好的做法还是坏的做法?这样做是正确的还是错误的?

PHPDoc是基于JavaDoc的,我相当确定在Java中你会在这里的b()方法中包含@throws声明。但我认为更重要的问题是,你是否认为了解b()可能抛出特定类型的异常对你和其他程序员来说实际上是有用的,尤其是如果它是你在调用b()时可能想要使用try/catch块捕获的异常类型。 - Matt Browne
2个回答

4

@throws注释用于提示开发者函数(function())是否可能引发异常。

首先你需要问自己一个问题:为什么在b()方法中不捕获异常?有充分的理由吗?

是的?那么你必须添加@throws注释,它将提示你或其他开发者使用函数b()不是安全的,他们将决定是否要捕获或传播异常。

此外,由于PHP并不强制要求您捕获另一个函数抛出的异常,因此@throws注释成为了一种必要的惯例。


盲目地捕获异常,因为它们是“不安全的”,这是对异常的错误态度。异常的优点在于您可以为成功情况提供清晰的代码路径,并让它们向上传播到堆栈是其中重要的一部分。您并没有明确否认这一点,但您的回答表明了这种(我认为有缺陷的)态度。 - Ulrich Eckhardt

1
事实上,b() 会抛出异常。无论是直接还是间接地发生都与调用者无关。现在,注释不应该记录可能随着不同派生类而变化甚至有所不同的内部实现细节。相反,注释记录了对于调用者可见的行为,因此有效的异常也应该是注释的一部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接