在Zend Framework应用程序中抛出模型/视图/控制器的异常

时间:2010-10-05 00:03:09

标签: php exception zend-framework

在Zend Framework库中,当前的做法(大约1.10.8)是库组件抛出了扩展Zend_Exception的异常。

E.g。 Zend_Layout组件会引发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模块中创建Exception类,类似于ZF库的组织方式。即,每个应用程序模块都有异常类,它们是否为每个库组件都有异常类?

  

应用/模块/用户/控制器/ UserController.php

     

应用/模块/用户/形式/ UserForm.php

     

应用/模块/用户/模型/ user.php的

     

应用/模块/用户/视图/脚本/ index.phtml

     

application / modules / user / exceptions / Exception.php(class User_Exception)

     

application / modules / user / exceptions / SuperexampleException.php(class User_Exception_Superexample)

我以前从未见过有人在ZF做过这样的事情,所以我不确定这是不是一个好主意。

更新

进一步澄清我的问题 - 当在应用程序的MVC部分(而不是库)中引发异常时 - 是否有关于使用特定异常类(如库所做的)与仅使用通用Exception类的约定?

2 个答案:

答案 0 :(得分:4)

我建议有一些“通用”例外,例如(InvalidParameter,InvalidRange)好的起点是czech framework called Nette

然后添加一些应用/用户/操作特定的例外 - 比如

  • InvalidUserInputException - 表示用户输入无效值的状态(如eshop中的数量为“-1”)
  • NotFoundException - 对于未找到某些内容的状态

将特殊成员变量添加到这些例外 - 例如 id data - 并使用它们将异常用作错误消息的传递。

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

答案 1 :(得分:0)

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

如果您需要捕获自定义异常,则需要在错误控制器中添加它们 这很容易和方便,我喜欢它,我很高兴它