簡體   English   中英

如何在laravel 5.2中顯示500個內部服務器錯誤頁面?

[英]how to show 500 internal Server error page in laravel 5.2?

我想顯示頁面500內部服務器錯誤頁面。 當用戶在項目中出現語法錯誤時,任何人都可以幫助我嗎? 如果我在語法上做了一些錯誤,我想展示那個特殊的刀片。

您需要創建處理程序以在處理程序中捕獲FatalErrorExceptions ,如下面的代碼:

處理 app/Exceptions/Handler.phpapp/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自定義錯誤視圖中獲取500更詳細或其他方式

在您的resources/views/errors文件夾中,創建一個名為500.blade.php的文件。

Laravel可以輕松顯示各種HTTP狀態代碼的自定義錯誤頁面。 例如,如果要為500 HTTP狀態代碼自定義錯誤頁面,請創建resources/views/errors/500.blade.php 此文件將在您的應用程序生成的所有500個錯誤中提供。

問題是Laravel只會為HttpException實例的異常自動呈現錯誤頁面。 不幸的是,當您的服務器拋出錯誤(方法不存在,變量未定義等)時,它實際上會拋出FatalErrorException 因此,它沒有被捕獲,並且向下移動到SymfonyDisplayer() ,它可以給你跟蹤(調試真實)或丑陋的單行'哎呀,看起來像是出錯了'(debug false)。

要解決此問題,您需要將此添加到app/Exceptions/Handler render方法中

# /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);
}

文件

我的解決方案很簡單,只需用以下代碼替換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視圖。

    // 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的異常。

在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)中的那個。

在Laravel 5.4中,您可以在app\\Exception\\Handler.php覆蓋prepareException函數:

/**
 * @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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM