2

我无法理解 Laravel 如何处理异常。我在 global.php 中注册了异常处理程序,如下所示:

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。关于此问题,SO 上还有其他线程,但到目前为止还没有解决方案。如果有人对此有所了解,我将不胜感激。

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

4

1 回答 1

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 Debug: Exception

但是,如果您从处理程序中返回某些内容,则只会触发第一个匹配的处理程序。要返回带有 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);
});

因此,一般来说,您希望首先定义异常处理程序。

于 2013-06-13T19:54:40.133 回答