【问题标题】:Exception handling in Laravel 4 - Problems understanding flowLaravel 4 中的异常处理 - 理解流程的问题
【发布时间】:2013-06-12 17:06:11
【问题描述】:

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

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

【问题讨论】:

    标签: laravel laravel-4


    【解决方案1】:

    异常处理可以看作是一个反向的瀑布。定义的最后一个处理程序首先被检查。举个例子:

    // 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 类型,因此输出: 调试:自定义异常 调试:异常

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

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

    【讨论】:

    • 谢谢,我发现了与您在此处回答的行为相同的行为 :) 也许对其他人有帮助:一旦您使用 View::make 渲染视图,响应代码就会设置为 200。要正确设置代码,请使用可以设置代码的 Response::view()。
    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多