Исключения и ведение журнала в Joomla Platform 11.1 и Joomla 2.5
Резюме из [Тема списка рассылки]
Платформа Joomla 11.1 изменила способ обработки исключений и ведения журнала, а также устарели JError и JException.
Справочная информация
Классы JError и JException были добавлены во фреймворк Joomla еще тогда, когда PHP 4.1 был нашим минимальным требованием. Они были включены, чтобы мы могли иметь некое подобие объекта исключения/потока ошибок в языке, который еще не до конца сформировался. К лучшему или худшему - такова история. При его реализации были приняты некоторые дизайнерские решения, которые действительно смешали понятия, что не является здоровым. Если вы подумаете о том, что делает JError, он смешивает концепцию обработки ошибок с протоколированием.
Добавление JLog к платформе позволило сделать нашу систему протоколирования гораздо более надежной, настраиваемой и простой в использовании. Не имело смысла бросать исключения для всех вещей, которые раньше мы возвращали JExceptions. Во-первых, иногда JError::raise() выдает предупреждение или уведомление, а затем продолжает выполнение. На самом деле это невозможно, поскольку выброс исключения приведет к остановке выполнения, пока оно не будет поймано, и это даже не учитывая тот факт, что это не то, чем на самом деле является исключение. В этом случае необходимо зарегистрировать предупреждение или уведомление и продолжить выполнение. Если возникает реальное состояние ошибки, достаточно серьезное для исключения, то оно должно рассматриваться как таковое. Это просто более соответствует современной практике программирования.
В платформе 11.1 есть такие блоки, как:
// Устаревший переключатель обработки ошибок на основе параметра JError::$legacy. // @deprecated 11.3 if (JError::$legacy) { JError::setErrorHandling(E_ERROR, 'die'); return JError::raiseError(500, JText::sprintf('JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER', $options['driver'])); } else { throw new DatabaseException(JText::sprintf('JLIB_DATABASE_ERROR_LOAD_DATABASE_DRIVER', $options['driver'])); }
Это обеспечивает уровень обратной совместимости при переходе от устаревших классов JError/JException. По сути, если флаг JError::$legacy верен, мы будем использовать старое поведение JError, но в противном случае мы просто выдадим исключение DatabaseException , которое в данном случае является чисто классом DatabaseException расширяет Exception {}, так что у нас есть немного больше специфики в типе исключения, а не корректировка в поведении.