错误异常处理

当程序出现错误或者异常时,我们一般会希望在开发时输出报错信息,在生产环境时隐藏详细的信息。

在 IMI 中,提供了 Http 服务的错误异常默认处理器支持。

默认 Http 错误处理器:Imi\Server\Http\Error\JsonErrorHandler

指定默认处理器

配置文件中:

  1. return [
  2. 'beans' => [
  3. 'HttpErrorHandler' => [
  4. // 指定默认处理器
  5. 'handler' => \Imi\Server\Http\Error\JsonErrorHandler::class,
  6. ],
  7. ],
  8. ];

处理器参数设置

  1. return [
  2. 'beans' => [
  3. \Imi\Server\Http\Error\JsonErrorHandler::class => [
  4. // debug 为 false时也显示错误信息
  5. 'releaseShow' => false,
  6. // 取消继续抛出异常
  7. 'cancelThrow' => true,
  8. ],
  9. ],
  10. ];

编写处理器

如下代码所示,实现IErrorHandler接口,handle()方法返回值为true时则取消继续抛出异常。

  1. <?php
  2. namespace Imi\Server\Http\Error;
  3. use Imi\App;
  4. use Imi\RequestContext;
  5. use Imi\Util\Format\Json;
  6. use Imi\Util\Http\Consts\MediaType;
  7. use Imi\Util\Http\Consts\RequestHeader;
  8. class JsonErrorHandler implements IErrorHandler
  9. {
  10. /**
  11. * debug 为 false时也显示错误信息
  12. * @var boolean
  13. */
  14. protected $releaseShow = false;
  15. /**
  16. * 取消继续抛出异常
  17. * @var boolean
  18. */
  19. protected $cancelThrow = true;
  20. public function handle(\Throwable $throwable): bool
  21. {
  22. if($this->releaseShow || App::isDebug())
  23. {
  24. $data = [
  25. 'message' => $throwable->getMessage(),
  26. 'code' => $throwable->getCode(),
  27. 'file' => $throwable->getFile(),
  28. 'line' => $throwable->getLine(),
  29. 'trace' => explode(PHP_EOL, $throwable->getTraceAsString()),
  30. ];
  31. }
  32. else
  33. {
  34. $data = [
  35. 'success' => false,
  36. 'message' => 'error',
  37. ];
  38. }
  39. RequestContext::get('response')
  40. ->withAddedHeader(RequestHeader::CONTENT_TYPE, MediaType::APPLICATION_JSON)
  41. ->write(Json::encode($data))
  42. ->send();
  43. return $this->cancelThrow;
  44. }
  45. }