Перехват определенных ошибок с помощью PHP eval () - PullRequest
0 голосов
/ 02 апреля 2011

ОБНОВЛЕНИЕ: Я понимаю, что есть недостатки с eval (), но я "должен" использовать его для этой конкретной проблемы. Поэтому любое решение проблемы должно иметь это в виду.

Я только начинаю работать с PHP в своем классе и реализую очень ограниченный калькулятор с использованием регулярных выражений (в частности, с preg_match ()) и eval (). Одна из особенностей калькулятора заключается в том, что, когда ему вводится неправильный ввод, отображается простое написанное мной сообщение об ошибке, а не ошибки PHP по умолчанию. Это работает для большинства некорректных входных данных (строки с буквами, несколько операторов в строке и т. Д.), Но я не смог обнаружить другие виды ошибок. В частности, входы:

0/0

и тому подобные

2--1

Последнее выражение технически правильно сформировано, но я не обязан его обрабатывать (предположительно, чтобы сделать наш код проще, поскольку это простой проект для знакомства с PHP), и вместо этого может вывести мое простое сообщение об ошибке в виде ответ. Калькулятор не поддерживает скобки, поэтому выражение вроде

2-(-1)

будет недействительным. Проблема в том, что я не могу понять, что eval () возвращает при обнаружении подобных вещей, если вообще вообще возвращается.

Всегда ли eval () возвращается? Я прочитал документацию по eval () несколько раз, но все еще не могу понять, какие вещи я должен проверять. Я предпочел бы получить объяснение того, что проверять и почему, а не просто слепо проверять возвращаемые значения и их дополнения, пока я не выясню это. Ниже приведены скриншоты двух ошибок, описанных выше (у меня недостаточно репутации, чтобы вставлять их здесь). Любая помощь будет оценена!

Ошибка деления на ноль

Ошибка нескольких операторов

1 Ответ

2 голосов
/ 02 апреля 2011

Это может показаться суровой вещью, но не делайте этого! Не используйте eval() так, это опасно. Помимо того, что это намного более безопасный способ сделать что-то, вы узнаете гораздо больше, написав простой токенизатор, чтобы разбить ввод в ваш калькулятор, а затем использовать алгоритм Дейкстры Shunting Yard * 1005. * чтобы (а) превратить его во что-то, что может быть оценено стековым компьютером, и (б) идентифицировать неожиданные токены в вашем потоке токенов (например, операторы, где вы ожидаете цифры).

eval() не гарантированно запускается, потому что вы вычисляете не просто простые выражения, а произвольный код.

Если вам абсолютно необходимо использовать eval(), используйте set_error_handler() и оператор подавления ошибок @ для перехвата ошибок до того, как они выплюнутся на пользователя. Вы можете использовать функцию error_reporting(), чтобы определить, была ли подавленная ошибка подавлена ​​с помощью @.

...