Резюме из [Тема списка рассылки]

Платформа 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 {}, так что у нас есть немного больше специфики в типе исключения, а не корректировка в поведении.