前言
和PHP默认的异常处理不同,ThinkPHP抛出的不是单纯的错误信息,而是一个错误页面。
如果是做web开发,给客户端返回这种错误页面还好;但如果是做API开发的话,返回这个页面客户端根本无法处理,所以我们需要对异常进行捕获处理。
异常分类
用户行为导致的异常
没有通过验证器、没有查询到结果。
通常不需要记录日志,需要向用户返回具体信息。
服务器自身的异常
代码错误、调用外部接口错误。
通常需要记录日志,不需要向客户端返回具体原因。
try-catch
相信对于大部分人而言,try-catch并不陌生。
使用try-catch我们可以在可能发生异常的地方进行异常捕获,然后对异常进行后续处理,返回给客户端可以处理的错误信息。
实例
try{
// 可能发生异常的业务逻辑
}
catch(Exception $ex){
// RESTful风格的错误返回信息
$err = [
'error_code'=>10001,
'msg'=>$ex->getMessage()
];
// 返回json格式的错误信息,并且规定HTTP状态码
return json($err,400);
}
try-catch这种异常捕获方式存在以下问题:
-
逐层抛出,如果是最底下的业务逻辑出现了问题会将异常逐层抛出,否则就会直接被原有的默认异常捕获到输出一个默认的错误页面;
-
如果是不可预知的异常,未做try-catch处理的业务逻辑,就会输出一个默认的错误页面;
-
某些错误信息不适合直接返回给客户端,需要做统一处理。
总结起来就是繁琐,不够健壮。
构建Validate层
实现步骤大致为:
-
自定义错误处理器——ExceptionHandler。
-
config.php的exception_hadle配置项修改为上面的自定义错误处理器。
-
创建基础异常处理类——BaseException。
-
创建具体异常处理类——xxxException。
错误处理器——ExceptionHandler
1)模块同级目录下,创建lib/exception文件夹
2)创建ExceptionHandler,继承think\exception\Handle
3)引用Exception类
4)重写render方法
我们定义,凡是继承了BaseException的异常,就属于用户导致的异常。
namespace app\lib\exception;
// 引用框架的Exception
use Exception;
// 引用Log类
use think