thinkphp5的异常处理流程就是当你捕获到异常时,一直向上抛出,最后会由tp5框架的全局异常处理捕获并返回一个html页面,这样即使客户端接收到了html页面,也看不懂且不需要这样的返回结果。
-
如果客户端接收结构服务器的返回是用json格式做处理,或者说客户端是ios端,那么你服务器异常返回一个html页面,有可能会造成客户端的崩溃。
-
如果是服务器内部的代码错误,也并不需要让客户端知道是服务器的内部的什么错误,客户端并不关心服务器的内部是什么错误,所以这个时候服务器有时候并不用把错误信息都返回给客户端,自己的内部错误可以用日志记录起来。
-
自定义异常返回结果,这样能更灵活的处理服务器发生异常错误的问题。
现在来模拟一下异常处理的过程:
1,首先在model操作数据库的时候产生异常错误。
2,在控制层banner.php中捕获并处理异常。
<?php
namespace app\api\controller\v1;
use app\api\validate\IDMustBePositiveInt;
use app\api\model\Banner as BannerModel;
use think\Exception;
class Banner {
/*
* 获取指定id 的banner信息
* @url /banner/:id
* @http GET
* @id banner的id
* */
public function getBanner($id) {
(new IDMustBePositiveInt())->goCheck();
//将model层返回的结构做异常处理
try{
$banner = BannerModel::getBannerByID($id);
}catch(Exception $ex){
//自定义异常的返回结构
//定义统一描述错误:
//error_code:自定义的错误码
//msg:错误描述信息
//400:状态码
$err = [
'error_code' => 10001,
'msg' => $ex->getMessage()
];
//不能直接返回一个数组,要转换成json字符串的形式返回给客户端,400代表http的状态码
return json($err,400);
}
return $banner;
}
}
结构就是这样,返回给客户端的就是一个json格式的错误提示。
如果在banner.php中捕获了异常但是没有处理它,而是继续向上抛出,那么
class Banner {
public function getBanner($id) {
(new IDMustBePositiveInt())->goCheck();
try{
$banner = BannerModel::getBannerByID($id);
}catch(Exception $ex){
throw new Exception($ex);
}
return $banner;
}
}
那么就会返回个客户端一个html的页面——奇丑无比