обработка ошибок — есть ли способ оценить часть кода php, где есть die () или exit (), и вернуться к основному коду, если он вызывается?

У меня нет контроля над кодом, который я выполняю. Это сторонняя функция, но не введенная пользователем. Это вещи, которые являются версионными, поэтому нецелесообразно тыкать туда и превращать все die () во что-то более вменяемое. Потому что время от времени появляется новая версия, и тогда я могу парадоксальным образом сделать код еще более небезопасным, пытаясь связать его с плохой обработкой ошибок.

так скажем у нас есть функция:

fuction myfunc() {
// lot's of complicated code
if (!is_file('myfile.txt') exit('file not found');
// and so on
}

Я пытаюсь выполнить этот фрагмент кода и вернуться к основному потоку, а затем действовать в соответствии с этой ошибкой.

я пробовал die() или же eval() но это возвращает весь сценарий.
Облом?

0

Решение

Подход Hail Mary заключается в использовании runkit«s runkit_function_redefine или же function_override переопределить функции die а также exit вместо этого бросить исключение.
Потенциальная проблема заключается в том, что третья сторона может перехватить эти исключения и может неправильно с ними справиться. Также очень вероятно, что вы не можете должным образом справиться с этим исключением.

Ты можешь использовать register_shutdown_function запустить код после exit был вызван. Вы несколько ограничены в том, что вы можете сделать на этом этапе, так как некоторые службы уже закрыты (например, автозагрузка). Я думаю, что вы все еще можете выводить контент, не уверенный в сессиях и других заголовках.

Другой подход заключается в запуске кода в отдельном php-процессе (или http-запросе), например, путем вызова php через exec.

Более надежный подход может заключаться в добавлении предсказаний в ваш собственный код, гарантируя, что плохие состояния никогда не будут достигнуты при вызове стороннего кода. Возможно, что не все предварительные условия могут быть выполнены.

В идеале только код, который является точкой входа (например, скрипт роутера), может exit, С помощью exit где-то еще просто дрянное программирование.

3

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

Если вы не читали Halcyon ответ, Вы должны взглянуть на это в первую очередь.

Поскольку вы упоминаете eval()Я предполагаю, что у вас есть код в виде строки. Я буду ссылаться на оба die() а также exit() только последним, но все должно быть актуально для обоих.

Вы можете попробовать чем-нибудь заменить вхождения die () и exit (), а затем eval. Это просто, но это может быть очень грязно.

Если вы решите сделать это, стоит обратить внимание на то, что вы можете в конечном итоге заменить вхождения, которые на самом деле не являются «кодом». Например, echo "Let him exit()";,

Кроме того, когда вы рассматриваете возможный эквивалентный синтаксис, как exit (); , exit; или же exit(1);Гораздо неприятнее. Вам придется справиться с этим с помощью регулярного выражения.

Но если вы можете с уверенностью предположить, что

  1. эти две подписи (die() а также exit()) единственные, о ком вам нужно беспокоиться; а также
  2. что строки (или другой контент) не будут содержать эти «фразы»

тогда вы можете использовать этот подход.

0

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