Лучшая альтернативная модель обработки исключений - PullRequest
2 голосов
/ 16 апреля 2009

К сожалению, у меня есть устаревшая система PHP4, в которую мне постоянно нужно добавлять функции. Не похоже, что будут ресурсы для переноса на PHP5 в течение нескольких месяцев, если не нескольких лет. В течение последних нескольких лет одна из главных вещей, которые меня беспокоили, - это отсутствие возможности чисто отбрасывать исключения. Из-за этого все виды кода проверки ошибок должны постоянно прерывать поток происходящего.

Итак, к вопросу: какова лучшая стратегия, которую вы видели для эмуляции чистоты обработки исключений в языках, в которых нет модели исключений?

Джоэл говорит об исключениях, как указано в ответе:

http://www.joelonsoftware.com/items/2003/10/13.html

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

Лучшая альтернатива состоит в том, чтобы ваши функции возвращали значения ошибок, когда что-то идет не так, и работали с ними явно, независимо от того, насколько многословно это могло бы быть. Это правда, что то, что должно быть простой трехстрочной программой, часто вырастает до 48 строк, когда вы вставляете хорошую проверку ошибок, но это жизнь, и ее обработка с исключениями не делает вашу программу более надежной. Я думаю, что причина, по которой программистов на языках стилей C / C ++ / Java привлекают исключения, заключается в том, что у синтаксиса нет краткого способа вызова функции, возвращающей несколько значений, поэтому трудно написать функцию, которая либо выдает возврат значение или возвращает ошибку.

Однако, хорошая модель исключений в языке заставляет вызываемую функцию указывать, что она на самом деле выдает исключение. Это подразумевает, что у функции есть ровно ноль дополнительных мест для выхода из функции (код будет просто возвращать false вместо генерации исключения), но для функции есть ровно 1 дополнительное место для выхода в ... Блок catch вызывающая функция. Любой может написать неаккуратный код, который передает все исключения вверх для обработки другими, но это не значит, что вы должны убрать инструмент, который можно использовать чисто и эффективно.

Фактически, любая функция может возвращать значение, выходящее за пределы ожидаемых значений возврата из вызывающего кода. Хороший программист собирается разобраться со всеми возможными возвращаемыми значениями, включая коды ошибок и условия. Модель исключений просто дает ему возможность сделать это чисто.

Ответы [ 2 ]

3 голосов
/ 16 апреля 2009

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

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

Затем в своем приложении, где вы обычно генерируете исключения, вместо этого вы можете вызвать ошибки . Если вам повезет, вы сможете использовать debug_backtrace () .

Удачи!

2 голосов
/ 16 апреля 2009

Продолжение прохождения стиля . На самом деле, я бы рискнул сказать, что он превосходит исключения с точки зрения «симпатичности». Это не самая естественная вещь для встраивания в PHP, но вы можете сделать это, используя объекты и шаблоны, такие как посетитель.

Но на самом деле, обновление с PHP4 до PHP5 не должно занимать более нескольких часов - оно в основном обратно совместимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...