控制器异常处理
这是一个简单的easyswoole的简单控制器处理类
<?php
namespace App\HttpController\Learn;
use EasySwoole\Http\AbstractInterface\Controller;
class Zq extends Controller
{
public function index()
{
throw new \HttpException("controller exception");
}
//重写父类的exception处理方法
public function onException(\Throwable $throwable): void
{
var_dump("exception controller");
}
}
如果我们访问index方法,看看easyswoole会返回什么给我们呢?一起来看一哈
确实调用了异常处理方法
注册全局注册处理异常方法
在APP目录下,我们建立一个exception目录
<?php
namespace App\Exception;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
class ExceptionHandler
{
public static function handle( \Throwable $exception, Request $request, Response $response )
{
var_dump($exception->getTraceAsString());
}
}
然后我们在EasySwooleEvent.php中的init方法中注册这个异常处理类
Di::getInstance()->set(SysConst::HTTP_EXCEPTION_HANDLER,[ExceptionHandler::class,'handle']);
我们自己定义一个ApiException异常处理类
<?php
namespace App\Exception;
use Throwable;
class ApiException extends \RuntimeException{
public function __construct(array $apiErr, Throwable $previous = null)
{
$code=$apiErr[0];
$message=$apiErr[1];
parent::__construct($message, $code, $previous);
}
}
然后我们在全局异常处理类接管方法编写异常处理方法
<?php
namespace App\Exception;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
class ExceptionHandler
{
public static function handle( \Throwable $exception, Request $request, Response $response ){
$data=[];
if($exception instanceof ApiException){
$code=$exception->getCode();
$msg=$exception->getMessage();
}else{
$code=$exception->getCode();
if(!isset($code)||$code<0){
$code=-1;
}
$msg=empty($exception->getMessage())?"unknow":$exception->getMessage();
}
$data['code']=$code;
$data['msg']=$msg;
$result=json_encode($data,JSON_UNESCAPED_UNICODE);
return $response->withHeader("Content-Type","application/json;charset=UTF-8")
->withHeader("Access-Control-Allow-Origin","*")
->write($result);
}
}
我们注释掉之前Zq控制器的onexception方法测试哈效果
<?php
namespace App\HttpController\Learn;
use App\Exception\ApiException;
use EasySwoole\Http\AbstractInterface\Controller;
class Zq extends Controller
{
public function index()
{
throw new ApiException([1,"Controller Exception"]);
}
}
测试效果
完全接管自定义异常