2015-11-18 2 views
0

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

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

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

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

Я пробовал die() или eval(), но это возвращает весь скрипт. Bummer?

+0

Не могли бы вы использовать это? http://php.net/manual/en/function.override-function.php – markdwhite

+0

@markdwhite: на самом деле это не так, потому что это довольно сложная вещь, она вызывает другие функции и объекты, и в каждой версии есть изменения, и я довольно не имеют права совать в каталог этого кода и изменить там вещи, он подключается к db, поэтому, если я испорчу что-то, что не будет красивым. – rsk82

+0

Если эта вещь фактически предполагается использовать в качестве библиотеки, тогда она никогда не должна делать такую ​​обработку ошибок Braindead. Вы говорите о гипотетических случаях или о реальных проблемах, которые у вас были с этим? На самом деле есть тонна больше вещей, о которых вы должны беспокоиться, что любой неподтвержденный код может испортиться, а не уверен, почему вы специально фокусируетесь на 'die'. Тестирование библиотеки перед ее выпуском в производство кажется единственным реалистичным вариантом. – deceze

ответ

3

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

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

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

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

Идеально только код, который является точкой входа (например, сценарием маршрутизатора), может быть exit. Использование exit в любом месте - просто дрянное программирование.

0

Если вы еще не читали Halcyon's answer, вы должны сначала взглянуть на него.

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

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

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

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

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

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

, то вы можете использовать этот подход этих «Фразы».