企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
封装之前确定下规范 **请求处理成功:** * json里面的code = 0 * response里面的http_code = 200。 **请求处理失败:** 客户端错误: * code = 1~1000 (其中500~1000可设计为有名错误,类似于计算机端口的有名端口,1~499可让程序开发人员任意使用) * http_code = 200 服务端错误: * code = 1001~2000 (其中1001~1500可设计为本服务错误,1501~2000可设计为本服务依赖的服务错误。 ) * http_code = 500。 以上思路的优点,我认为: 1、当服务端api异常,需要服务端开发者介入的时候,http_code = 500,这样可以让监控程序,很方便的监控到。 2、将错误分为,客户端开发者处理的错误(不记录日志,返回详细错误信息),和服务端开发者处理的错误(记录日志,不返回错误详情),这样便于客户端开发者及时排除问题。 **返回数据格式如下** 成功 ``` {"code":0,"message":"消息内容","data":{}} ``` 失败 ``` {"code":10000,"message":"消息内容","data":{}} ``` 当然你也可以参考# [阿里和Google的JAVA开发规约](https://www.cnblogs.com/HappyBeibei/p/11105182.html) tp默认的全局异常在根目录`\thinkphp\library\think\Exception.php` ``` namespace think; class Exception extends \Exception{ ... } ``` **1定义全局异常** 框架支持异常页面由开发者自定义类进行处理,需要在config.php配置`exception_handle`,默认为空 (`'exception_handle'=>'',`)调用的是 think\exception\Handle 即`\thinkphp\library\think\exception\Handle.php`下的Handle类 捕获的错误将在handle的render方法输出 >[danger] 记得在应用下开启`app_bug=true` 模块下的无效哦 接下来我们将重写Handle类,首先修改`exception_handle` ~~~ 'exception_handle'=>'app\lib\exception\ExceptionHandle' ~~~ 然后新建application/lib/exception/ExceptionHandler.php 负责渲染错误信息 ~~~ namespace app\lib\exception; use think\Exception; use think\exception\Handle; use think\Request; /** * 注意: * tp默认调用的异常处理类是think\exception\Handle; * 调用异常处理类可以在config.php配置默认为空 'exception_handle'=>'',调用的是 think\exception\Handle * 默认调用application/lib/exception/下的这个类则需要修改配置为:'exception_handle'=>'app\lib\exception\ExceptionHandle' * */ class ExceptionHandler extends Handle{ private $code;//Http Code private $msg; private $errorCode; public function render(Exception $e){ if ($e instanceof BaseException) {//!!!!如果BaseException 与这个Exceptionhandler不是同一个命名空间一定要引入空间啊 $this->code=$e->code; $this->msg=$e->message; $this->errorCode=$e->errorCode; }else{ $this->code=500; $this->msg="服务器内部错误"; $this->errorCode=999;//自定义的哦         //这里手动记录日志 } $request=Request::instance(); $result=array( 'msg'=>$this->msg, 'error_code'=>$this->errorCode, 'request_url'=>$request->url() ); return json($result); } } ~~~ **为应用定义一个公共异常类** 然后新建application/lib/exception/BaseException.php baseException定义code msg errorCode这三个属性的默认值 ~~~ namespace app\lib\exception; use think\Exception; class BaseException extends Exception{ //将错误代码设为http状态码,业务错误代码设为errorCode public $code=400; //错误的具体信息 public $message="参数错误"; //自定义的业务错误码 public $errorCode="10000"; } //基类属性参考 protected string $message ;//异常消息内容 protected int $code ;//异常代码 protected string $file ;//抛出异常的文件名 protected int $line ;//抛出异常在该文件中的行号 ~~~ **每个模块每个错误类型定义一个异常类继承BaseException** application/lib/exception/BannerMissException.php ~~~ namespace app\lib\exception; //use app\lib\exception\Handle; class BannerMissException extends BaseException{ //http状态码 public $code=404; //错误的具体信息 public $message="请求的Banner不存在"; //自定义的错误码 public $errorCode=40000; } ~~~ ## **用法:** 在model中查询数据并在banner控制器调用 当model中没有数据时调用BannermissException 这时exceptionHandler的render将捕获这个错误 **模块** ~~~ namespace app\api\Model; use think\Model; // use think\Excption; class Banner extends Model{ public static function getBannerById($id){ //TODO:根据bannerid号获取banner信息 return null; //return "this is banner info"; } } ~~~ **控制器** ~~~ namespace app\api\controller\v1; use think\Controller; use app\api\Model\Banner as BannerModel;//这里的Banner和Model的Banner重名 use app\lib\exception\BannerMissException; class Banner extends controller{ public function index(){ //http://localhost/thinkphp5/public/index.php/api/v1.Banner/index } public function getBanner($id){ $banner=BannerModel::getBannerById($id); if (!$banner) { throw new BannerMissException(); } } } ~~~