Создание исключения в методе деструктора

Я не могу найти надежный источник, чтобы гарантировать, что я могу бросить исключение внутри __destruct(),

Вот что говорит php документация

Попытка выбросить исключение из деструктора (вызываемого во время завершения сценария) приводит к фатальной ошибке.

Но когда я проверяю это

class A
{
public function __destruct()
{
throw new \Exception();
}
}

try {
$a = new A();

} catch(\Exception $x) {
var_dump($x);
}

кажется, что это не так. Я бросаю и ловлю исключения нормально. Итак, почему док получил эту строку?

отредактировано после ответа Марка Бейкера:

это на самом деле работает, исключение может быть выброшено и получено от деструктора. Я все еще не уверен, почему документация лежит тогда.

3

Решение

Деструктор не вызывается нигде в вашем скрипте, поэтому ваш блок 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, которая уничтожает объект; и это то, что приводит к фатальной ошибке

Неустранимая ошибка: необнаруженное исключение

Так что это то, о чем вас предупреждает документация

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]