Laravel 5.6-异常处理程序,为Api处理内部服务器错误(500)

时间:2018-12-22 11:49:43

标签: exception-handling laravel-5.6

在laravel中,我们可以按以下方式处理异常:

 public function render($request, Exception $exception)
{
    if ($exception instanceof ModelNotFoundException or $exception instanceof NotFoundHttpException)
    {
        if($request->ajax() || $request->wantsJson()) {
            return response()->json([
                'message' => 'Record not found',
            ], 404);
        }


    }


    return parent::render($request, $exception);
}

但是,如果发生内部服务器错误,则应用程序将在生产中返回Whoops something went wrong页面,而在调试中将返回堆栈跟踪。

使用期望json的api时如何处理内部服务器错误?

3 个答案:

答案 0 :(得分:0)

您实际上可以在ErrorException(app / Exceptions / Handler.php)方法内的render()上添加另一张支票:

public function render($request, Exception $exception)
{
    if ($exception instanceof ModelNotFoundException or $exception instanceof NotFoundHttpException)
    {
        if($request->ajax() || $request->wantsJson()) 
        {
            return response()->json([
                'message' => 'Record not found',
            ], 404);
        }
    }

    // ==> Add this check
    if ($exception instanceof ErrorException) 
    {
        if($request->ajax() || $request->wantsJson()) 
        {
            return response()->json([
                'message' => 'Something went wrong on our side',
            ], 500);
        }
    }

    return parent::render($request, $exception);
}

答案 1 :(得分:0)

这是我的解决方法:

if (!$this->isHttpException($exception)) 
{
    if($request->ajax() || $request->wantsJson()) 
    {
        return response()->json([
            'message' => 'Something went wrong on our side',
        ], 500);
    }
}

答案 2 :(得分:0)

我遇到了类似的问题,但这是我的 .htaccess 文件,我的配置不正确。 (我的环境是Laravel 5.6,Bitmani LAMP)

.htaccess 必须具有以下内容:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On
RewriteBase /

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

对我有用,它修复了我的API中的“内部服务器错误(500)” 。一项建议是,您检查apache日志(error_log和access_log),它们可以为您提供更多信息。

希望对您有帮助。