Ответ 1
Рассмотрим код, в котором вы используете интерфейс:
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
следует ожидать исключения.
Теперь рассмотрим нулевого автора, который просто отбрасывает записи. Там абсолютно ничего нет, что могло бы пойти туда неправильно, поэтому нет необходимости в исключениях.
Но что, если у вас есть $log
, и все, что вы знаете об этом, это реализация LogWriter
. Вы полагаете, что он не бросает исключений и потенциально случайно позволяет одному пузырю, или вы предполагаете, что он может выбросить LogWriterException
? Я остался бы в безопасности и предполагал, что он может вызвать исключение LogWriterException.
Если все пользователи знают, что $log
является LogWriter, но только DbLogWriter документируется как исключение, пользователь может не понимать, что $log->write(...)
может генерировать исключение. Кроме того, когда FileLogWriter будет позже создан, это будет означать ожидания того, какие исключения могут быть реализованы и, возможно, будут выбрасываться, уже не будут установлены (никто не ожидал, что FileLogWriter
будет выбросить RandomNewException
).