2011-06-30 64 views
0

我正在編寫CakePHP(cakephp.org)控制器。其中一個動作「myAction」響應AJAX請求。我覺得很煩人的是,如果在動作處理程序中出現任何錯誤,Cake總是響應一個錯誤頁面 HTTP狀態爲200,這意味着它失敗了,所以我必須打開一個新窗口並直接運行AJAX請求從地址欄中查看輸出並找出出錯的地方。作爲一個例子,說我編寫以下動作,其產生除以零誤差當發生未處理的異常時,讓CakePHP返回50x HTTP響應

function myAction() { 
    0/0; // produce a divide-by-0 error for the sake of example 
} 

蛋糕返回一個錯誤頁作爲其爲200的HTTP狀態代碼(換句話說響應,蛋糕是告訴我它返回的「成功」的錯誤頁)

我嘗試過加入以下兩行除以零:

define('DISABLE_DEFAULT_ERROR_HANDLING', true); 
set_error_handler('myError', E_ALL); 
0/0; 

然後在全局命名空間:

function myError($code, $msg) { 
    CakeLog::write('error', "code=$code: $msg"); 
    header('HTTP/1.0 500 Internal Error'); 
    die($code); 
    } 

在這種情況下,CakePhp從不發送響應。對於瀏覽器來說,響應永遠留在「等待中」。

爲了便於比較,我寫了一個簡單的獨立(PHP,沒有蛋糕)頁:

<?php 
function myHandler($errrno, $msg) { 
    header('HTTP/1.0 500 Internal Error'); 
    die($msg); 
} 

set_error_handler(myHandler, E_ALL); 
0/0; 
die('got here'); 
?> 

它的輸出是

被零除

預期。

我知道必須有更好的方法來配置CakePHP自動處理控制器/動作處理程序中的錯誤,這些處理程序不需要執行大量的代碼。

CakePHP and jQuery - Unobtrusive actionsUsing HTTP status codes to reflect success/failure of Web service request?上的優秀帖子有助於讓我知道我在正確的軌道上,但他們仍然不滿足我希望Cake發生意外異常時返回50x的HTTP響應的願望。然後,當響應返回時,瀏覽器可能會在頁面上顯示一條消息,例如「發生錯誤,通知網站管理員」,並且我知道要查看Apache錯誤日誌以瞭解真正發生的事情。

歡迎任何想法。

回答

0

「Cake總是響應一個錯誤頁面和一個200的HTTP狀態」 - 只有在調試開啓時纔會發生。

爲什麼你想要自己的錯誤處理程序,你可以很容易地創建AppError並擴展蛋糕ErrorHandler乾淨地處理。

做這樣的事情

try{ 
    devideByZero(); // throws an error 
} 
catch(Exeption $e){ 
    $this->cakeError('yourCustom5xxError'); 
} 
+0

「爲什麼你想擁有自己的錯誤處理」 因爲AppError似乎總是返回HTTP狀態200,即使在請求失敗。對於在瀏覽器窗口中顯示的響應,這可能沒有問題,但對於AJAX調用而言不適用。如果出現問題,我希望它返回一個狀態代碼,告訴處理程序出錯了,比如50x。 這是一個約定,AJAX請求應該總是返回200,並將其實際狀態放在它的響應中,如{「status」:「fooey!」,「reason」:「dunno」,...}。如果是這樣,我想知道更多。 –

+0

這樣覆蓋錯誤,所以它不返回200.你可以使用RequesHandler來檢查ajax並使它像你想要的那樣返回 – dogmatic69

相關問題