【问题标题】:Php Slim not handle errors with the custom errorHandlerPhp Slim 不使用自定义 errorHandler 处理错误
【发布时间】:2016-03-19 13:48:09
【问题描述】:

我的自定义错误处理程序不适用于 Slim 3 框架。我没有收到 500 错误,而是收到状态为 200 的响应,并且正文中包含 html 错误详细信息。

这是我的最小、可验证和完整的示例:

$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);

$app->any('/foo', function($request, $response, $args) {
    $data = json_encode($request->nonExistingMethod()); // error!
    return $response->withJson($data);
});

$app->run();

我需要如何重构此示例才能使其正常工作?我怀疑这与错误的致命性质有关。但是这种情况下怎么处理呢?

参考:http://www.slimframework.com/docs/handlers/error.html

编辑 1

为了在 api 风格的 web 应用程序中使用,我使用的最终解决方案与此问题的回答略有不同:

function checkForError() {
  $last = error_get_last();

  if ($last) {
    @header("HTTP/1.0 500 Internal Server Error");
    echo json_encode($last); // optional, includes error details in json format
  }
}

error_reporting(0);
register_shutdown_function('checkForError');

【问题讨论】:

  • 您正在尝试对不存在的方法进行 JSON 编码。你的期望是什么?如果你尝试编码一些不存在的东西,它就会崩溃。
  • 这是一个强制错误的示例代码。问题是 errorHandler 不起作用,我在正文中收到 200 响应,而不是来自 errorHandler 的 500 响应。
  • 好的,现在我明白你在说什么了。你需要注册那个错误处理程序吗? docs.slimframework.com/errors/500
  • 这是 Slim 2 中的方式,但我使用的是 Slim 3,并且寄存器不同。我会用这个更新问题。

标签: php slim


【解决方案1】:

你无法捕捉到所有这样的错误

但是,有一种方法可以捕获除内存错误之外的所有错误(或仅捕获那些试图分配超过您的错误处理程序需要的错误)

function checkForError() {
  $last = error_get_last();

  if ($last) {
    @header("HTTP/1.0 500 Internal Server Error");
    echo 'we failed... sry';
  }
}

register_shutdown_function('checkForError');

更新为 500 状态标题

【讨论】:

  • 是否可以修改此代码并返回 500 状态代码而不是 200 html 或文本消息?
  • 是的 - 刚刚添加了代码 - 在标头前面使用 @ 很重要,因为可能已经有一些输出已经发送到客户端
  • 此外,ob_clean() 删除了错误的 html 详细信息,因此我得到了“类似 api”的响应!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多