Выбрасывание исключений из модели / представления / контроллера в приложении Zend Framework

В библиотеке 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 .

Затем добавьте некоторые исключения для приложения / пользователя / действия, например

  • InvalidUserInputException – для состояний, в которых пользователь вводил недопустимое значение (например, «-1» как количество в eshop)
  • NotFoundException – для состояний, в которых что-то не найдено
  • и т.п.

Добавьте специальные переменные-члены в эти исключения – например, идентификатор или данные – и используйте их для использования исключений в качестве доставки сообщений об ошибках.

 $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; } 

и если вам нужно поймать пользовательское исключение, вам нужно добавить их в контроллер ошибок, это легко и удобно, мне это нравится, и я очень доволен им