Zend Framework 入門(3)——錯誤處理

日期:2008-07-02  作者:喜騰小二  來源:PHPChina


使用 Zend Framework 的 MVC 結構,如果不做特殊的處理,所有的異常都會被前端控制器捕獲,並累積起來。

Zend Framework 提供了若乾種方法來處理異常。這裡介紹最簡單的一種。

在第一部分《快速上手》中,我們已經有了一個很簡單的錯誤處理機制,即通過 applicatoin/controllers/ErrorController.php 以及其中定義的 errorAction 方法來處理異常。不過,隻是給出了一個很簡陋的報錯信息。現在,我們把它再完善一下,達到兩個基本要求:

  1. 用戶請求了不存在的控制器或動作(404 錯誤),在用戶的浏覽器中給出報錯信息;
  2. 其他的繫統錯誤,則在日誌文件中記錄下來。

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); ?>

注意:如果妳需要記錄所有的異常和錯誤,包括各種警告,可以參考這裡

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计