В библиотеке Zend Framework текущая практика (около 1.10.8) заключается в том, что компоненты библиотеки Zend_Exception
исключения, расширяющие Zend_Exception
.
Например, компонент Zend_Layout_Exception
В моей собственной библиотеке ZF, где я добавляю свои собственные компоненты ZF или расширяя существующие компоненты, я бросаю Mylibrary_Exception
(на самом деле это не называется 🙂
Я вижу, что они собираются изменить некоторые из них в ZF 2.0
http://framework.zend.com/wiki/display/ZFDEV2/Proposal+for+Exceptions+in+ZF2
Мой фактический вопрос таков:
Во всем моем приложении MVC в моих контроллерах / моделях / представлениях, если мне нужно выбросить исключение (и это будет редко, потому что, очевидно, я буду обрабатывать ожидаемые ошибки по-другому) – НО, если мне нужно выбросить исключение здесь, что является лучшей практикой в ZF?
я должен просто
throw new Exception("this is an exception");
или я должен создавать классы исключений в своих ZF-модулях, подобно тому, как организована библиотека ZF. т.е. у них есть классы исключений для каждого компонента библиотеки, должен ли я иметь классы исключений для каждого модуля приложения?
Применение / модули / пользователь / Контроллеры / UserController.php
приложения / модули / пользовательская / форма / UserForm.php
приложения / модули / пользовательская / модель / User.php
Применение / модули / пользователь / мнение / скрипты / index.phtml
application / modules / user / exceptions / Exception.php (класс User_Exception)
application / modules / user / exceptions / SuperexampleException.php (класс User_Exception_Superexample)
Я никогда не видел, чтобы кто-то делал что-то подобное раньше в ZF, поэтому я не уверен, что это хорошая идея или нет.
ОБНОВЛЕНИЕ :
Чтобы уточнить мой вопрос дальше – при создании исключений в части приложения MVC (в отличие от библиотеки) – существуют ли какие-либо соглашения относительно использования определенных классов исключений (например, библиотеки), а только с использованием общего класса Exception?
Я бы предложил использовать некоторые «общие» исключения (InvalidParameter, InvalidRange). Хорошей отправной точкой является чешская структура под названием Nette .
Затем добавьте некоторые исключения для приложения / пользователя / действия, например
Добавьте специальные переменные-члены в эти исключения – например, идентификатор или данные – и используйте их для использования исключений в качестве доставки сообщений об ошибках.
$e = new NotFoundException('There is no user %s in here!'); $e->setUser('Frank'); throw $e; // later in error controller if ($e instanceof NotFoundException) { // set header to 404, display error message, etc }
Хорошо, что вы можете расширять исключения так или иначе, как угодно, и ловить их в контроллере ошибок так или иначе (даже лучше использовать интерфейсы)
class AccessDeniedExceptionimplements ILogableException //... throw new AccessDeniedException(); //in EC if ($e instanceof ILoggableException) { $this->getLogger()->log($e->getLogMessage()); }
Выбрасывание исключений в ZF V1 обрабатывается контроллером ошибок по умолчанию
$errors = $this->_getParam('error_handler'); switch ($errors->type) { case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: // 404 error -- controller or action not found $this->getResponse()->setHttpResponseCode(404); $this->view->message = 'Page not found'; break; default: // application error $this->getResponse()->setHttpResponseCode(500); $this->view->message = 'Application error'; break; }
и если вам нужно поймать пользовательское исключение, вам нужно добавить их в контроллер ошибок, это легко и удобно, мне это нравится, и я очень доволен им