在实际开发过程中,我们可能遇到很多不可预知的异常,比如未定义的变量等,api接口定义了统一的数据结构返回,如果直接抛出异常,前端可能识别不了导致系统崩溃,所以我们要针对异常进行处理,保证代码健壮性。
1、在\app\ExceptionHandle.php的render方法可以直接处理返回异常格式
public function render($request, Throwable $e): Response
{
// 添加自定义异常处理机制
$result = [
'code' => 0,
'message' => $e->getMessage(),
'data' => []
];
return json($result, 400);
}
2、以上方法是针对公共异常处理,如果只是想对多应用模块下的api模块进行这种格式的异常返回,可以通过以下方法:
在api模块下新建exception文件夹,并且在exception下面创建Http.php文件,代码如下:
<?php
namespace app\api\exception;
use think\exception\Handle;
use think\Response;
use Throwable;
/**
* 不可预知的异常处理
* Class Http
* @package app\api\exception
*/
class Http extends Handle
{
public $httpStatus = 500;
public function render($request, Throwable $e): Response
{
// http状态码获取,比如throw new \think\exception\HttpException(400, '无效请求')设置了状态码
if (method_exists($e, 'getStatusCode')) {
$httpStatus = $e->getStatusCode();
} else {
$httpStatus = $this->httpStatus;
}
// 添加自定义异常处理机制
$result = [
'code' => 0,
'message' => $e->getMessage(),
'data' => []
];
return json($result, $httpStatus);
}
}
在\app\api下新建provider.php,并添加如下代码
<?php
use app\api\exception\Http;
// 容器Provider定义文件
return [
'think\exception\Handle' => Http::class,
];
测试未定义变量异常:
在\app\api\controller\Index.php,添加代码
<?php
namespace app\api\controller;
use app\BaseController;
class Index extends BaseController
{
public function index()
{
echo $a;
}
}
返回:
{"code":0,"message":"Undefined variable: a","data":[]}
测试抛出异常:
<?php
namespace app\api\controller;
use app\BaseController;
class Index extends BaseController
{
public function index()
{
throw new \think\exception\HttpException(400, '无效请求');
}
}
返回:
{"code":0,"message":"无效请求","data":[]}
并且F12调试模式下,可以看到相应的HTTP状态码也发生变化
加我微信公众号:,一起学习哦~
网友评论