如何在laravel 5.2中显示500个内部服务器错误页面?

时间:2016-12-19 06:09:47

标签: php laravel laravel-5.2

我想显示页面 500内部服务器错误页面。当用户在项目中出现语法错误时,任何人都可以帮助我吗?如果我在语法上做了一些错误,我想展示那个特殊的刀片。

6 个答案:

答案 0 :(得分:13)

您需要创建处理程序以在处理程序中捕获FatalErrorExceptions,如下面的代码:

<强>处理程序app/Exceptions/Handler.php

public function render($request, Exception $e)
{

    // 404 page when a model is not found
    if ($e instanceof ModelNotFoundException) {
        return response()->view('errors.404', [], 404);
    }

    // custom error message
    if ($e instanceof \ErrorException) {
        return response()->view('errors.500', [], 500);
    } else {
        return parent::render($request, $e);
    }

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

查看resources/views/errors/500.blade.php。如果不存在则创建它。

您可以从Laravel 5 custom error view for 500

获取更详细或其他方式

答案 1 :(得分:6)

resources/views/errors文件夹中创建名为500.blade.php的文件。

  

Laravel可以轻松显示各种HTTP的自定义错误页面   状态代码。例如,如果您希望自定义错误页面   500个HTTP状态代码,创建resources/views/errors/500.blade.php。此文件将在您的应用程序生成的所有500个错误中提供。

问题是Laravel只会为HttpException实例的异常自动呈现错误页面。不幸的是,当您的服务器抛出错误(方法不存在,变量未定义等)时,它实际上会抛出FatalErrorException。因此,它没有被捕获,并且逐渐向SymfonyDisplayer()发送,它可以为您提供跟踪(调试真实)或丑陋的单行&#39;哎呀,看起来出了问题&#39; (调试错误)。

要解决此问题,您需要将此render方法添加到app/Exceptions/Handler

# /app/Exceptions/Handler.php

# use Symfony\Component\Debug\Exception\FlattenException;

# public function render($request, Exception $e)

$exception = FlattenException::create($e);
$statusCode = $exception->getStatusCode($exception);

if ($statusCode === 404 or $statusCode === 500) {
    return response()->view('errors.' . $statusCode, [], $statusCode);
}

Docs

答案 2 :(得分:1)

我的解决方案很简单,只需用以下代码替换Exceptions \ Handler.php文件中的render()方法:

/**
 * Render an exception into an HTTP response.
 *
 * @param \Illuminate\Http\Request $request
 * @param \Exception               $exception
 *
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($request->expectsJson()) {
        return $this->renderJson($request, $exception);
    }

    if ($this->shouldReport($exception) && app()->environment('production')) {
        $exception = new HttpException(500, $exception->getMessage(), $exception);
    }

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

如果应用程序处于生产环境中,它将显示500页。您需要在resources / views / errors文件夹中包含500.blade.php视图。

答案 3 :(得分:0)

    // app/Exceptions/Handler.php

    protected function prepareResponse($request, Exception $e)
    {
        if($this->isHttpException($e) === false && config('app.debug') === false)     {
            $e = new HttpException(500);
        }

        return parent::prepareResponse($request, $e);
    }

就像@Amit所说

  

问题是Laravel只会自动渲染   异常的错误页面是HttpException的实例。

所以我的解决方案是用HttpException替换任何不是HttpException的异常。

答案 4 :(得分:0)

在app \ Exceptions \ Handler中创建以下方法:

protected function convertExceptionToResponse(Exception $e)
{
        $e = FlattenException::create($e);
        return response()->view('errors.500', ['exception' => $e], $e->getStatusCode(), $e->getHeaders());
}

它将覆盖显示whoops页面的父类(Illuminate \ Foundation \ Exceptions \ Handler)中的那个。

答案 5 :(得分:0)

在Laravel 5.4中,您可以覆盖prepareException中的app\Exception\Handler.php功能:

/**
 * @inheridoc
 */
protected function prepareException(Exception $e)
{
    $exception = parent::prepareException($e);

    if(!config('app.debug')) {
        if(!$exception instanceof HttpException && $this->shouldReport($exception)) {
            $exception = new HttpException(500);
        }
    }

    return $exception;
}