MVC 异常
介绍
Zend Framework 中的MVC元件利用了一个前端控制器,这意味着到一个站点的所有请求都将通过单一入口。因此,所有的异常最终将起泡到前端控制器,开发人员可在一个位置处理这些异常。
但是,异常消息以及回溯信息可能含有敏感的系统信息,比如SQL语句,文件位置等等。为了保护站点,Zend_Controller_Front 默认将捕捉所有异常并注册到响应对象,响应对象默认不会显示异常消息。
如何处理异常?
MVC元件已经建立了几种机制来处理异常。
-
默认地,错误处理器插件(error handler plugin) 将会被注册并激活。这个插件可以处理:
控制器或动作缺失导致的异常
动作控制器中发生的异常
它作为一个postDispatch() 插件,检查分发器、动作控制器或者其他的异常是否发生。如果发生异常,它将转向一个错误处理控制器。
该处理器会涵盖大多数异常情况,并能够优美的处理控制器或者动作缺失异常。
-
Zend_Controller_Front::throwExceptions()
通过向该方法传入一个true值,可以通知前端控制器,由开发人员来处理异常,而不是让响应对象收集或者使用错误处理器插件。例如:
$front->throwExceptions(true);
try {
$front->dispatch();
} catch (Exception $e) {
// handle exceptions yourself
}
这是向前端控制器中加入定制处理所有可能异常的最简单方式。
-
Zend_Controller_Response_Abstract::renderExceptions()
通过向该方法中传入一个true值,可以让响应对象渲染(render)异常消息,当渲染响应对象时追踪异常(backtrace)。这种情况下,将会显示程序中引发的所有异常。推荐只在非生产(non-production)环境中使用。
-
Zend_Controller_Front::returnResponse() 和
Zend_Controller_Response_Abstract::isException() .
向Zend_Controller_Front::returnResponse() 传入一个true值, Zend_Controller_Front::dispatch() 将不渲染响应对象,而是将其返回。获得响应对象后,可通过isException() 测试是否捕捉到异常,然后通过getException() 获取异常。例如:
$front->returnResponse(true);
$response = $front->dispatch();
if ($response->isException()) {
$exceptions = $response->getException();
// handle exceptions ...
} else {
$response->sendHeaders();
$response->outputBody();
}
这种方式相对于Zend_Controller_Front::throwExceptions() 的主要优点在于,可以在异常处理后有条件的渲染响应对象。不像错误处理器插件,该方法能够捕捉到控制器链中的任何异常。
可能遭遇的MVC异常
各种MVC元件--请求,路由器,分发器,动作控制器,响应对象--在同一事件中可能每一个都会抛出异常。一些异常可能根据情况被忽略,其他的则提示开发人员考虑程序的结构。
比如:
|
|