easyswoole中在控制器中调用业务的时候,可以在业务中抛出异常。可以通过两种方式处理全局捕获异常。
第一种: 重写控制器基类的 onException 方法。 重写一个控制器基类 BaseController , 继承框架的Controller。
重写onException 即可,这样就可以捕获所有的子控制器异常。[推荐第二种]
<?php
namespace App\HttpController;
use EasySwoole\Http\AbstractInterface\Controller;
/**
* 控制器基类
*/
class BaseController extends Controller
{
/**
* 控制器 方法执行 异常捕获
*/
protected function onException(\Throwable $e): void
{
// throw $throwable; //
$msg = $e->getMessage(); //获取捕获异常的信息
switch(get_class($e)){
case \InvalidArgumentException::class: // 参数非法
$code = -1;
$status = 200;
break;
case \LogicException::class:
$code = -2;
$status = 201;
break;
case \RuntimeException::class:
$code = -2;
$status = 201;
break;
case \Exception::class:
$code = 500;
$status = 500;
break;
case \Error::class:
$code = 500;
$status = 500;
break;
default:
$code = -2;
$msg = "未知错误";
$status = 200;
break;
}
\EasySwoole\EasySwoole\Trigger::getInstance()->error('test error');
$this->response()->withStatus($status);
$this->response()->withHeader("Content-Type","application/json;charset=utf-8");
$this->response()->write(json_encode([
"code"=>$code,
"msg"=>$msg,
],JSON_UNESCAPED_UNICODE));
}
}
二、通过全局异常处理类 处理 [推荐使用]。该种方式的优先级低于第一种, 当第一种开启的时候,该方式不会生效。
在实际业务中,推荐关闭第一种方式,使用 全局异常处理类处理
1. 创建全局处理类文件 . /App/Exception/HandleException.php
<?php
namespace App\Exception;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
/**
* 适用于 http 服务中的 mvc模式 全局异常捕获
*/
class HandleException
{
public static function handle( \Throwable $exception, Request $request, Response $response )
{
var_dump(get_class($exception));
var_dump("异常处理文件");
$response->write("返回信息到客户端"); // 控制器不会向下执行
}
}
2 . 注册全局异常处理类。
在框架的全局事件类 EasyswooleEvent.php 的 initialize 方法中 加入
\EasySwoole\Component\Di::getInstance()->set(SysConst::HTTP_EXCEPTION_HANDLER,[\App\Exception\HandleException::class,'handle']);
总结: 可以通过全局异常处理,做线上实时预警。当产生不同级别的异常时。通知开发者
传统的 throw 抛出异常会阻止程序的运行。
easyswoole 可通过 Trigger 触发的异常,不会终止程序的运行。关于Trigger 触发异常,请看 Trigger