考虑使用接口的代码:
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
现在考虑空编写器,它只是丢弃条目。那里绝对没有任何东西会出错,因此,不需要例外。
然而,如果你有一些,你所知道的只是它是 的实现。你是假设它不会抛出异常,并可能意外地让一个冒泡,还是假设它可以抛出一个?我会保持安全,并假设它可以抛出LogWriterException。$log
LogWriter
LogWriterException
如果用户只知道是 LogWriter,但只有 DbLogWriter 被记录为引发异常,则用户可能没有意识到可以引发异常。此外,当稍后创建FileLogWriter时,这将意味着已经设置了实现可以并且可能引发的异常的期望(没有人会期望抛出一个)。$log
$log->write(...)
FileLogWriter
RandomNewException