封装异常处理
配置
先创建自己的 BaseException 类
<?php
namespace app\exception;
use app\enums\StatusCodeEnum;
class BaseException extends \Exception
{
public $success = false;
public $status = 1;
public $statusInfo = [
"message" => "服务器正忙",
];
// 这里是我自己设置的一个状态码类,StatusCodeEnum::INTERNAL_SERVER_ERROR = 500
public $httpStatus = StatusCodeEnum::INTERNAL_SERVER_ERROR;
public function __construct($message = "", $code = 0, $httpStatus = 500)
{
if (!is_numeric($code)) {
$code = 0;
}
if (!is_numeric($httpStatus)) {
$httpStatus = 500;
}
$this->httpStatus = $httpStatus;
$this->status = $code;
$this->statusInfo = [
"message" => $message,
];
parent::__construct($message, $code);
}
// 这里也可以写在公共方法中脱离出来
public function getError()
{
return [
"success" => $this->success,
"status" => $this->status,
"statusInfo" => $this->statusInfo,
];
}
}
再写一个类进行继承这个类
没有需要不用修改任何东西,继承的父类已经够用了
<?php
namespace app\exception\AppException;
use app\exception\BaseException;
// 我这个是一个参数报错异常
class ParameterException extends BaseException
{
}
使用
在UserMiddle中间件中使用
<?php
namespace app\middleware;
// 以上代码省略。。。。。。
class UserMiddle
{
public function handle($request, \Closure $next)
{
// 获取请求参数
$params = $request->param();
try {
// 验证用户信息,指定验证类为UserValidate,验证场景为login,并检查参数是否通过验证
validate(UserValidate::class)->scene("login")->check($params);
} catch (ValidateException $e) {
// 验证失败,抛出异常,返回错误信息
// 在这里抛出我们自己配置的类,不写参数会有默认的参数
throw new ParameterException($e->getMessage(), 1,500);
}
return $next($request);
}
}
配置ExceptionHandle类异常处理
<?php
namespace app;
// 以上代码省略。。。。。。
/**
* 应用异常处理类
*/
class ExceptionHandle extends Handle
{
// 以上代码省略。。。。。。
public function render($request, Throwable $e): Response
{
// 添加自定义异常处理机制,判断类型,自己可以灵活搭配
if($e instanceof ParameterException){
return json($e->getError(),$e->httpStatus);
}
// 其他错误交给系统处理
return parent::render($request, $e);
}
}