【问题标题】:how to show 500 internal Server error page in laravel 5.2?如何在 laravel 5.2 中显示 500 内部服务器错误页面?
【发布时间】:2025-12-17 21:50:01
【问题描述】:

我想显示页面 500 internal server error 页面。当用户在项目中出现语法错误时,谁能帮助我?如果我在语法上犯了一些错误,我想展示那个特定的刀片。

【问题讨论】:

标签: php laravel laravel-5.2


【解决方案1】:

您需要创建处理程序以在处理程序中捕获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获取更多详细信息或其他方式

【讨论】:

  • 很高兴为您提供帮助..干杯...!
  • else 语句可以去掉,因为如果“if”语句为假,它仍然会转到函数的最后一个返回。
【解决方案2】:

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

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

问题在于,Laravel 只会为 HttpException 实例的异常自动呈现错误页面。不幸的是,当您的服务器抛出错误(方法不存在、变量未定义等)时,它实际上会抛出 FatalErrorException。因此,它是未被捕获的,并流向SymfonyDisplayer(),它要么为您提供跟踪(调试为真),要么为您提供丑陋的单行“哎呀,看起来出了点问题”(调试错误)。

要解决此问题,您已将其添加到 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

【讨论】:

  • 这应该是公认的答案,因为它有效并且包含在 Laravel 官方文档中。
【解决方案3】:

我的解决方案很简单,只需将 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 视图。

【讨论】:

    【解决方案4】:
        // 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 的异常。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

        在 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;
        }
        

        【讨论】:

          最近更新 更多