Правильная обработка ошибок в пользовательском Zend_Autoloader?
-
20-09-2019 - |
Вопрос
Я создаю пользовательский автозагрузчик на основе автозагрузки Zend Framework (связанный вопрос здесь).
Основной подход, взятый из этого вопроса, заключается в
class My_Autoloader implements Zend_Loader_Autoloader_Interface
{
public function autoload($class)
{
// add your logic to find the required classes in here
}
}
а затем привязать новый класс автозагрузчика к префиксу класса.
Теперь, в чем я не уверен, так это в том, как обрабатывать ошибки внутри autoload
метод (например, "файл класса не найден") надлежащим образом, совместимым с ZF способом.Я новичок в фреймворке, его условностях и стиле.
Должен ли я спокойно возвращать false и допустить сбой процесса создания класса?
Должен ли я каким-то образом выводить сообщение об ошибке или журнале (что было бы неплохо для точного определения проблемы) и возвращать false?Если да, то каков способ Zend сделать это?
Вызываю ли я ошибку?
Должен ли я выдавать исключение?Если да, то какого рода?
Решение
Это зависит от вида ошибки.Я бы счел это неустранимой ошибкой, если класс не может быть загружен.Таким образом, я бы выдал исключение, например
class My_Autoloader_Exception extends Exception {}
Вы обнаружите, что ZF использует множество пользовательских исключений на уровне пакета, а также предоставляет класс чтобы это распространялось на (хотя я бы счел это необязательным).
Кстати, есть пример использования Zend_Exception
с их автозагрузчиком:
try {
// Calling Zend_Loader::loadClass() with a non-existant class will cause
// an exception to be thrown in Zend_Loader:
Zend_Loader::loadClass('nonexistantclass');
} catch (Zend_Exception $e) {
echo "Caught exception: " . get_class($e) . "\n";
echo "Message: " . $e->getMessage() . "\n";
// Other code to recover from the error
}
Другие советы
Сам ZF использует два разных подхода:
Zend_Loader
(тот Старый механизм автоматической загрузки) выдаетZend_Exception
на случай, если что-то не такZend_Loader_Autoloader
ВОЗВРАТfalse
когда используемый зарегистрированный автозагрузчик возвращаетсяfalse
В Zend_Loader_Autoloader
не улавливает никаких исключений, генерируемых в используемом автозагрузчике, чтобы в конечном итоге ваше пользовательское исключение всплывало через Zend_Loader_Autoloader
.Я лично просто возвращаюсь false
на случай, если я не смогу загрузить запрошенный класс.