Laravel Exceptions Handler无法正常工作

时间:2015-10-06 06:36:14

标签: php laravel exception laravel-5.1

环境:Laravel 5.1,PHP 5.6.10

我尝试以JSON格式实现App\Exceptions\Handler::render()响应错误消息。

app/Exceptions/Handler.php如下:

// ignore..

public function render($request, Exception $e)
{
    if ($e instanceof ModelNotFoundException) {
        $e = new NotFoundHttpException($e->getMessage(), $e);
    } elseif ($e instanceof AbstractException) {
        return response()->apiJsonError(
                $e->getMessage(),
                $e->getErrors(),
                $e->statusCode());
    }

    // ignore...
}

在控制器中,它也会引发异常:

if (ArrayUtil::isIndexExceed($list, $maxIndex)) {
    // Index exceeds
    throw new App\Exceptions\ExceedingIndexException;
}

但是,当发生错误时,不会调用Handler :: render()。响应是ExceedingIndexException堆栈。

以下部分是异常类

我的自定义异常类ExceedingIndexException

namespace App\Exceptions;

use App\Http\Responses\Error;
use App\Exceptions\AbstractException;

class ExceedingIndexException extends AbstractException
{
    public function __construct()
    {
        $message = 'Unable to execute';
        $error = new Error('exceeding_index_value');
        $statusCode = 400;

        parent::__construct($statusCode, $error, $message);
    }
}

ExceedingIndexException类继承AbstractException

namespace App\Exceptions;

abstract class AbstractException extends \Exception
{
    protected $statusCode;
    protected $errors;

    public function __construct(
        $statusCode, $errors, $message, $code = 0, \Exception $previous = null) {
        parent::__construct($message, $code, $previous);

        $this->statusCode = $statusCode;
        $this->errors = $errors;
    }

    public function getStatusCode() 
    {
        return $this->statusCode;
    }

    public function getErrors() 
    {
        return $this->errors;
    }
}

解决方案

我发现我的项目依赖于RESTful API的Dingo API。因为,Dingo也支持并注册自己的异常处理程序,所以不会调用App\Exceptions\Handler

我尝试使用Custom Exception Responses in Dingo API作为我的异常处理程序来响应JSON格式的错误。它对我有用。

2 个答案:

答案 0 :(得分:1)

实际上,您可以通过自定义错误处理程序替换Dingo API错误处理程序。获取https://github.com/KIVagant/api/blob/develop/src/Exception/Handler.php的副本 并将其保存到YourApp \ Exceptions \ Api \ V1 \ Handler.php。添加界面Dingo \ Api \ Contract \ Debug \ ExceptionHandler, 然后按照Exceptions now can return any additional data中的说明进行操作。

use Dingo\Api\Contract\Debug\ExceptionHandler as DingoExceptionHandler;
class Handler implements ExceptionHandler, DingoExceptionHandler {

替换错误处理程序,例如在boot()中。

// Resolve YourApp\Exceptions\Api\V1\Handler ifself
$this->app->alias('api.exception', 'YourApp\Exceptions\Api\V1\Handler');

$this->app->singleton('api.exception', function ($app) {
    return new \YourApp\Exceptions\Api\V1\Handler($app['Illuminate\Contracts\Debug\ExceptionHandler'],
            $app['config']['api.errorFormat'], $app['config']['api.debug']);
});

不要忘记设置错误格式。您可以在boot()中设置错误格式,例如:

// Set up error format
$this->app['api.exception']->setErrorFormat(...)

答案 1 :(得分:0)

确实,Dingo API接管了异常处理。

你遇到类似的问题,其中Lumen异常处理程序不处理任何事情,可能是一些包接管了处理。在这种情况下,它是Dingo API。

为Dingo API的例外注册自定义响应: https://github.com/dingo/api/wiki/Errors-And-Error-Responses#custom-exception-responses