2013-06-12 91 views
2

我對理解Laravel如何處理異常有困難。 我註冊global.php異常處理程序是這樣的:Laravel 4中的異常處理 - 理解流程的問題

use MyNamespace\Custom\Exceptions\NotAllowedException; 
App::error(function(NotAllowedException $exception, $code) 
{ 
    die("MyNamespace\Custom\Exceptions\NotAllowedException catched"); 
}); 

App::error(function(\Exception $exception) 
{ 
    echo "general exception thrown<br/>"; 

}); 

在控制器的行動我現在拋出一個NotAllowedException。然而奇怪的部分是,之後的第一個Exception被捕獲並且NotFoundException。從而

的輸出是:

general exception thrown 
MyNamespace\Custom\Exceptions\NotAllowedException catched 

我認爲異常處理程序棧,因此僅NotAllowedException被處理。但我錯了。我是否誤解了Laravel中錯誤處理的概念還是這種意外行爲?

另一件事:我無法將http響應標頭設置爲401.對於此問題,SO上還有其他線程,但目前還沒有解決方案。如果有人對此有所瞭解,我將不勝感激。

謝謝你的時間和每一個迴應! 乾杯

回答

12

異常處理可以看作是一個顛倒的瀑布。首先檢查最後一個定義的處理程序。就拿這個例子:

// Custom Exception 
class CustomException extends Exception {} 

// Error handler in global.php 
App::error(function(Exception $exception, $code) 
{ 
    echo 'Debug: Exception<br/>'; 
}); 

App::error(function(CustomException $exception, $code) 
{ 
    echo 'Debug: CustomException<br/>'; 
}); 

// Exception in routes.php (or any other place) 
throw new CustomException(); 

兩種類型匹配的異常類型,所以這種輸出: 調試:CustomException 調試:異常

但是,如果你從你的處理程序中返回的東西,只有第一個匹配的處理器被觸發。要返回一個HTTP 401響應代碼的JSON響應,這樣做:

App::error(function(Exception $exception, $code) 
{ 
    return Response::json(array(
     'error' => 'Something went wrong (Exception)' 
    ), 500); 
}); 

App::error(function(NotAllowedException $exception, $code) 
{ 
    return Response::json(array(
     'error' => 'Something went wrong (NotAllowedException)' 
    ), 401); 
}); 

所以,一般情況下,你會想先定義的異常處理程序。

+2

謝謝你,我想出了與你在這裏回答相同的行爲:)也許這對其他人有用:只要你使用View :: make渲染視圖,響應代碼就設置爲200.要正確設置代碼,使用Response :: view()可以設置代碼。 – grange