ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 500 系统错误处理器 [Edit This Page](https://github.com/slimphp/Slim-Website/tree/gh-pages/docs/handlers/error.md) 出问题了!你并不能预知错误,但你可以预料到。每个 Slime 框架应用程序都有一个错误处理器用于接收所有未抓取的 PHP 异常。这个错误处理器同样能接收当前 HTTP 的请求对象和响应对象。这个错误处理器必须预备并返回一个适当的响应对象,这个对象会被返回到 HTTP 客户端。 ## 默认的错误处理器 默认的错误处理器非常基础。它将响应状态编码设置为 `500`,并将响应内容类型设置为 `text/html`,并将一个通用的错误信息加入到响应体中。 这个对于生产应用_大概_不太合适。强烈建议你实现专用于你的 Slim 应用程序的错误处理器。 默认的错误处理程序还可以包括详细的错误诊断信息。要启用这个功能你需要将 `displayErrorDetails` 设置为 true : ``` $configuration = [ 'settings' => [ 'displayErrorDetails' => true, ], ]; $c = new \Slim\Container($configuration); $app = new \Slim\App($c); ``` ## 自定义错误处理器 Slim 框架应用程序的错误处理器是一种 Pimple 服务。你可以通过应用程序容器对自定义 Pimple factory 方法进行定义,来创建自定义的错误处理器取代默认的。 有两种注入处理器的方法: ### Pre App ``` $c = new \Slim\Container(); $c['errorHandler'] = function ($c) { return function ($request, $response, $exception) use ($c) { return $c['response']->withStatus(500) ->withHeader('Content-Type', 'text/html') ->write('Something went wrong!'); }; }; $app = new \Slim\App($c); ``` ### Post App ``` $app = new \Slim\App(); $c = $app->getContainer(); $c['errorHandler'] = function ($c) { return function ($request, $response, $exception) use ($c) { return $c['response']->withStatus(500) ->withHeader('Content-Type', 'text/html') ->write('Something went wrong!'); }; }; ``` 在这个例子中,我们定义了一个新的 `errorHandler` factory ,它将返回一个 callable 。返回的 callable 接收三个参数: 1. 一个 `\Psr\Http\Message\ServerRequestInterface` 实例 2. 一个 `\Psr\Http\Message\ResponseInterface` 实例 3. 一个 `\Exception` 实例 这个 callable **必须** 返回一个新的 `\Psr\Http\Message\ResponseInterface` 实例,对于给定的异常也是如此。 **务必注意**:下面这三个类型的异常不会被自定义的 `errorHandler` 处理: * `Slim\Exception\MethodNotAllowedException`: 这个可以用自定义的 [`notAllowedHandler`](/docs/handlers/not-allowed.html) 来处理。 * `Slim\Exception\NotFoundException`: 这个可以用自定义的 [`notFoundHandler`](/docs/handlers/not-found.html) 来处理。 * `Slim\Exception\SlimException`: 这种类型的异常是 Slim 内置的,它的处理不能被覆写。 ### 禁用 要想彻底地禁用 Slim 的错误处理器,只需从容器中移除错误处理器即可: ``` unset($app->getContainer()['errorHandler']); ``` 现在,你需要负责处理所有异常了,因为 Slim 已经不再处理它们。