前几天在开发的时候用到了第三方的扩展包,使用过程中第三方扩展包抛出了异常

因为这边是接口开发,需要返回错误代码以及提示信息等,所以就需要接管异常处理。

此文章只做笔记,有不对或不详细的地方欢迎大家留言交流。

首先先在application下创建目录exception

然后创建BaseException类,此类为自定义异常类基类,继承框架异常类或php异常类都可。

<?php
/**
* BaseException.php
* 文件描述:自定义异常类基类,继承框架异常类
*/ namespace app\common\exception; use think\Exception;
use Throwable; /**
* Class BaseException
* 自定义异常类的基类
* @package app\common\exception
*/
class BaseException extends Exception
{
public function __construct($message = "", $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
}

这里重写父类的构造方法,然后调用父类的构造方法,这块我看的有点迷,欢迎大家留言分享。

手册上写了,框架支持异常页面由开发者自定义类进行处理,需要配置参数exception_handle

// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle' => '\\app\\common\\exception\\Http',

自定义类需要继承Handle并且实现render方法,手册参考:https://www.kancloud.cn/manual/thinkphp5/126075

<?php
/**
* ExceptionHandler.php
* 文件描述:重写后的异常处理类
*/ namespace app\common\exception; use DawnApi\exception\UnauthorizedException;
use Exception;
use think\exception\Handle;
use think\Log; class ExceptionHandler extends Handle
{
private $code;//http状态码
private $msg;//异常消息
private $errorCode;//异常状态码 public function render(Exception $e)
{
if ($e instanceof BaseException)
{
//使用instanceof判断异常是否为自定义异常
$this->code = 200;
$this->msg = $e->getMessage();
$this->errorCode = $e->getCode();
} elseif ($e instanceof UnauthorizedException) {
//使用instanceof判断异常是否为第三方扩展包异常
$this->code =200;
$this->errorCode = 401;
$this->msg = '授权失败';
} else {
//其他异常
$this->errorCode = 10003;
$this->msg = '操作失败';
}
$this->recordErrorLog($e);//将异常写入日志,方便查看
return json(['code'=>$this->errorCode,'msg'=>$this->msg]);
} /**
* Notes:将异常写入日志
* @param Exception $e
*/
private function recordErrorLog(Exception $e) {
Log::init([
'type' => 'File',
'path' => LOG_PATH,
'level' => ['error'],
]);
Log::record([
'错误文件' => $e->getFile(),
'错误行数' => $e->getLine(),
'错误代码' => empty($this->code) ? $e->getCode() : $this->code,
'错误消息' => empty($this->message) ? $e->getMessage() : $this->message,
], 'error');
}
}

最新文章

  1. intent打开第三方应用
  2. html5——canvas画直线
  3. float属性
  4. 面向对象的Javascript(5):继承
  5. Spring(四)Bean注入方试
  6. setSupportActionBar(toolbar)导致程序崩溃闪退
  7. Basler usb SDK安装在opencv采集图像
  8. Oracle 用户权限分配说明
  9. c++字符串机理
  10. 【转】Android Recovery模式
  11. 网易云课堂_C语言程序设计进阶_期末考试编程题部分
  12. Notes over compiling..
  13. php 代码编写的格式
  14. 【方法】Oracle用户密码含特殊字符时的登陆问题
  15. 20155304 2016-2017-2 《Java程序设计》第五周学习总结
  16. JS前端数据格式化
  17. Rabin-Karp【转载】
  18. 项目实战3—Keepalived 实现高可用
  19. Python的控制语句
  20. 用MATLAB结合四种方法搜寻罗马尼亚度假问题

热门文章

  1. javascript获取url中的参数值
  2. Node.js自动本地重启服务器
  3. UUID生成库libuuid和crossguid
  4. 实验吧——认真一点(绕过空格,逗号,关键字过滤等 sql盲注)
  5. 超快速度下载MNIST数据集
  6. 【JavaScript】案例一:使用JS完成注册页面表单校验——事件(onsubmit&amp;onfocus&amp;onblur)
  7. PAT 乙级 1038.统计同成绩学生 C++/Java
  8. CSP复习与模板
  9. Feign 报错:No fallback instance of type class xxx found for feign client xxx
  10. 24-C#笔记-异常处理