У меня нет контроля над кодом, который я выполняю. Это сторонняя функция, но не введенная пользователем. Это вещи, которые являются версионными, поэтому нецелесообразно тыкать туда и превращать все die () во что-то более вменяемое. Потому что время от времени появляется новая версия, и тогда я могу парадоксальным образом сделать код еще более небезопасным, пытаясь связать его с плохой обработкой ошибок.
так скажем у нас есть функция:
fuction myfunc() {
// lot's of complicated code
if (!is_file('myfile.txt') exit('file not found');
// and so on
}
Я пытаюсь выполнить этот фрагмент кода и вернуться к основному потоку, а затем действовать в соответствии с этой ошибкой.
я пробовал die()
или же eval()
но это возвращает весь сценарий.
Облом?
Подход Hail Mary заключается в использовании runkit«s runkit_function_redefine
или же function_override
переопределить функции die
а также exit
вместо этого бросить исключение.
Потенциальная проблема заключается в том, что третья сторона может перехватить эти исключения и может неправильно с ними справиться. Также очень вероятно, что вы не можете должным образом справиться с этим исключением.
Ты можешь использовать register_shutdown_function
запустить код после exit
был вызван. Вы несколько ограничены в том, что вы можете сделать на этом этапе, так как некоторые службы уже закрыты (например, автозагрузка). Я думаю, что вы все еще можете выводить контент, не уверенный в сессиях и других заголовках.
Другой подход заключается в запуске кода в отдельном php-процессе (или http-запросе), например, путем вызова php через exec
.
Более надежный подход может заключаться в добавлении предсказаний в ваш собственный код, гарантируя, что плохие состояния никогда не будут достигнуты при вызове стороннего кода. Возможно, что не все предварительные условия могут быть выполнены.
В идеале только код, который является точкой входа (например, скрипт роутера), может exit
, С помощью exit
где-то еще просто дрянное программирование.
Если вы не читали Halcyon ответ, Вы должны взглянуть на это в первую очередь.
Поскольку вы упоминаете eval()
Я предполагаю, что у вас есть код в виде строки. Я буду ссылаться на оба die()
а также exit()
только последним, но все должно быть актуально для обоих.
Вы можете попробовать чем-нибудь заменить вхождения die () и exit (), а затем eval. Это просто, но это может быть очень грязно.
Если вы решите сделать это, стоит обратить внимание на то, что вы можете в конечном итоге заменить вхождения, которые на самом деле не являются «кодом». Например, echo "Let him exit()";
,
Кроме того, когда вы рассматриваете возможный эквивалентный синтаксис, как exit ();
, exit;
или же exit(1);
Гораздо неприятнее. Вам придется справиться с этим с помощью регулярного выражения.
Но если вы можете с уверенностью предположить, что
die()
а также exit()
) единственные, о ком вам нужно беспокоиться; а такжетогда вы можете использовать этот подход.