Рассмотрим код, где вы потребляете интерфейс:
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.
Если все, что пользователь знает, что $log
является LogWriter, но только DbLogWriter документирован как бросать исключение, пользователь не может понять, что $log->write(...)
может бросить исключение. Кроме того, когда позже будет создан FileLogWriter, это будет означать ожидания того, какие исключения, которые может быть реализована и, возможно, будет выбрано, будут уже установлены (никто не ожидал, что FileLogWriter
будет выбросить RandomNewException
).
Эта запись @throws предназначена только для целей документации (например, ApiGen), она не имеет ничего общего с фактическим кодом. В языке программирования Java есть ключевое слово 'throws', определяющее в интерфейсе, что какая-то функция бросает исключение и какое исключение он вызывает, в PHP нет, к сожалению. Если бы была такая функциональность, это заставило бы вас реализовать механизм catch catch в вашем коде, как вам нужно реализовать функции реализации. – sbrbot
@sbrbot Хорошая документация по IDE + может быть частичной заменой для строгих языковых функций. – donquixote
Ха, ха, этот комментарий почти 2 года (PHP4). Текущий PHP поддерживает исключения, такие как Java, и мой предыдущий комментарий больше недействителен. – sbrbot