Laravel 4中的异常处理 - 理解流程的问题

时间:2013-06-12 17:06:11

标签: laravel laravel-4

我在理解Laravel如何处理异常时遇到了问题。 我在global.php中注册了Exception处理程序,如下所示:

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。然而,奇怪的是,第一个异常被捕获,然后是NotFoundException。

输出因此是:

general exception thrown 
MyNamespace\Custom\Exceptions\NotAllowedException catched

我认为异常处理程序堆栈因此只处理NotAllowedException。但我错了。我是否误解了Laravel中错误处理的概念,还是这种意外行为?

另一件事:我无法将http响应标头设置为401.关于此问题还有其他线程,但到目前为止还没有解决方案。如果有人对此有所了解,我将不胜感激。

感谢您的时间和每一个回复! 干杯

1 个答案:

答案 0 :(得分: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();

两种类型都匹配Exception类型,因此输出: Debug: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);
});

因此,通常,您需要首先定义异常处理程序。