К сожалению, у меня есть устаревшая система PHP4, в которую мне постоянно нужно добавлять функции. Не похоже, что будут ресурсы для переноса на PHP5 в течение нескольких месяцев, если не нескольких лет. В течение последних нескольких лет одна из главных вещей, которые меня беспокоили, - это отсутствие возможности чисто отбрасывать исключения. Из-за этого все виды кода проверки ошибок должны постоянно прерывать поток происходящего.
Итак, к вопросу: какова лучшая стратегия, которую вы видели для эмуляции чистоты обработки исключений в языках, в которых нет модели исключений?
Джоэл говорит об исключениях, как указано в ответе:
http://www.joelonsoftware.com/items/2003/10/13.html
Они создают слишком много возможных точек выхода для функции. Чтобы написать правильный код, вам действительно нужно продумать каждый возможный путь кода в вашей функции. Каждый раз, когда вы вызываете функцию, которая может вызвать исключение и не перехватить его на месте, вы создаете возможности для неожиданных ошибок, вызванных внезапно завершившимися функциями, оставив данные в несогласованном состоянии или другими путями кода, которые вы не сделали. думать о.
Лучшая альтернатива состоит в том, чтобы ваши функции возвращали значения ошибок, когда что-то идет не так, и работали с ними явно, независимо от того, насколько многословно это могло бы быть. Это правда, что то, что должно быть простой трехстрочной программой, часто вырастает до 48 строк, когда вы вставляете хорошую проверку ошибок, но это жизнь, и ее обработка с исключениями не делает вашу программу более надежной. Я думаю, что причина, по которой программистов на языках стилей C / C ++ / Java привлекают исключения, заключается в том, что у синтаксиса нет краткого способа вызова функции, возвращающей несколько значений, поэтому трудно написать функцию, которая либо выдает возврат значение или возвращает ошибку.
Однако, хорошая модель исключений в языке заставляет вызываемую функцию указывать, что она на самом деле выдает исключение. Это подразумевает, что у функции есть ровно ноль дополнительных мест для выхода из функции (код будет просто возвращать false вместо генерации исключения), но для функции есть ровно 1 дополнительное место для выхода в ... Блок catch вызывающая функция. Любой может написать неаккуратный код, который передает все исключения вверх для обработки другими, но это не значит, что вы должны убрать инструмент, который можно использовать чисто и эффективно.
Фактически, любая функция может возвращать значение, выходящее за пределы ожидаемых значений возврата из вызывающего кода. Хороший программист собирается разобраться со всеми возможными возвращаемыми значениями, включая коды ошибок и условия. Модель исключений просто дает ему возможность сделать это чисто.