使用 Zend Framework 的 MVC 结构,如果不做特殊的处理,所有的异常都会被前端控制器捕获,并累积起来。 Zend Framework 提供了若干种方法来处理异常。这里介绍最简单的一种。 在第一部分《快速上手》中,我们已经有了一个很简单的错误处理机制,即通过 applicatoin/controllers/ErrorController.php 以及其中定义的 errorAction 方法来处理异常。不过,只是给出了一个很简陋的报错信息。现在,我们把它再完善一下,达到两个基本要求: 用户请求了不存在的控制器或动作(404 错误),在用户的浏览器中给出报错信息; 其他的系统错误,则在日志文件中记录下来。 1. 创建日志 创建一个与 application 平行的文件夹,命名为 logs。 编辑 html/index.php 文件,加入下面的代码: require_once 'Zend/Log.php'; require_once 'Zend/Log/Writer/Stream.php'; $log = new Zend_Log(new Zend_Log_Writer_Stream($rootPath . '/logs/errors.log', 'a+')); Zend_Registry::set('error_log', $log); 注意:Web 服务器应具有对 logs 文件夹的读写权限。 2. 完善错误处理代码 编辑 application/controllers/ErrorController.php 文件,新的 errrorAction 方法为: public function errorAction() { $log = Zend_Registry::get('error_log'); $content = null; $errors = $this->_getParam ('error_handler') ; switch ($errors->type) { 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 ()->setRawHeader ( 'HTTP/1.1 404 Not Found' ) ; // ... get some output to display... $content = "error_page_not_found"$$ break ; default : // application error; display error page, but don't change // status code $content = "error_unexpected"$$ // ... // Log the exception $exception = $errors->exception; $log->debug($exception->getMessage() . PHP_EOL . $exception->getTraceAsString()); break ; } // Clear previous content $this->getResponse()->clearBody(); $this->view->content = $content; } 在 languages/zh_cn.php 中加入错误信息的中文条目(如果你不需要支持多国语言,那么可以忽略这些): 'error_page_not_found' => " 404 错误:页面不存在!" . PHP_EOL . '对不起,您所要求的页面不存在。 ', 'error_unexpected' => '错误!' . PHP_EOL . '对不起,系统无法响应您的请求。请稍后再试。 ',最后,略微修改一下 application/views/error/error.phtml 文件: 其中的错误显示代码为: translate($this->content); ?>
|