考虑使用接口的代码:
public function doSomething(MyInterface $my) { ... }
如果甚至其中一个实现可以引发异常,您将需要确保处理异常的可能性。
所以,是的,它应该被记录在案。
即使只有一个实现抛出异常,异常处理仍然需要到位。当然,这并不意味着每个方法都应该有一个@throws。它仍应仅在适当的情况下使用(您期望实现合法地需要抛出异常)。
作为更具体的示例,请考虑以下内容:
interface LogWriter
{
/**
* @throws LogWriterException
*/
public function write($entry);
}
class DbLogWriter
{
public function __construct(PDO $db)
{
//store $db somewhere
}
public function write($entry)
{
try {
//store $entry in the database
} catch (PDOException $e) {
throw new LogWriterException(...);
}
}
}
class NullLogWriter
{
public function write($entry) { }
}
可以做一些事情来尝试降低写入数据库时发生异常的可能性,但归根结底,这不是异常安全操作。因此,DbLogWriter::write
应该预期会抛出异常。
现在考虑 null writer,它只是丢弃条目。那里绝对没有任何可能出错的地方,因此,不需要例外。
但是,如果您有一些$log
并且您所知道的只是它是LogWriter
. 您是否认为它不会抛出异常并可能不小心让一个冒泡,或者您是否认为它可以抛出一个LogWriterException
?我会保持安全,并假设它可以抛出 LogWriterException。
如果用户只知道这$log
是一个 LogWriter 但只有 DbLogWriter 被记录为抛出异常,用户可能没有意识到$log->write(...)
可以抛出异常。此外,当稍后创建 FileLogWriter 时,这意味着已经设置了实现可以并且可能会抛出哪些异常的期望(没有人会期望FileLogWriter
抛出 a RandomNewException
)。