Я не могу найти надежный источник, чтобы гарантировать, что я могу бросить исключение внутри __destruct()
,
Вот что говорит php документация
Попытка выбросить исключение из деструктора (вызываемого во время завершения сценария) приводит к фатальной ошибке.
Но когда я проверяю это
class A
{
public function __destruct()
{
throw new \Exception();
}
}
try {
$a = new A();
} catch(\Exception $x) {
var_dump($x);
}
кажется, что это не так. Я бросаю и ловлю исключения нормально. Итак, почему док получил эту строку?
отредактировано после ответа Марка Бейкера:
это на самом деле работает, исключение может быть выброшено и получено от деструктора. Я все еще не уверен, почему документация лежит тогда.
Деструктор не вызывается нигде в вашем скрипте, поэтому ваш блок try / catch ничего не поймает. если ты unset($x)
внутри блока try / catch тогда будет сгенерировано исключение, которое будет должным образом перехвачено.
class A {
public function __destruct() {
throw new \Exception();
}
}
try {
$a = new A();
unset($a);
} catch(\Exception $x) {
var_dump($x);
}
В противном случае PHP выдает исключение при завершении скрипта, но это находится за пределами вашего блока try / catch
РЕДАКТИРОВАТЬ
Исключение, выдаваемое при завершении сценария, если ваш объект не был уничтожен вручную, не может быть перехвачено, потому что вы не можете обернуть try / catch вокруг внутренней обработки завершения PHP, которая уничтожает объект; и это то, что приводит к фатальной ошибке
Неустранимая ошибка: необнаруженное исключение
Так что это то, о чем вас предупреждает документация
Других решений пока нет …