优势:
1.异常处理通常是防止未知错误产生所采取的处理措施。异常处理的好处是不用再绞尽脑汁去考虑各种错误,这为处理某一类错误提供了一个很有效的方法,使编程效率大大提高。
2.自定义抛出异常的好处,避免if else嵌套,增强代码可读性,返回给前端一个简化的json信息,进行相应处理。
TP6实例
在app目录下新建lib\exception文件夹
在文件夹下新建ExceptionHandle.php,BaseException.php
ExceptionHandle.php代码,重写render
<?php
namespace app\lib\exception;
use think\Exception;
use think\exception\Handle;
use think\Log;
use think\Response;
use Throwable;
/**
* 应用异常处理类
*/
class ExceptionHandle extends Handle
{
public $httpStatus =500 ;
private $code;
private $msg;
private $errorCode;
public function render($request, Throwable $e): Response
{
if($e instanceof BaseException){
$this->code = $e->code;
$this->msg = $e->msg;
$this->errorCode = $e->errorCode;
}else{
if(env('APP_DEBUG', '0')){
return parent::render($request, $e);
}else{
$this->code =500;
$this->msg='服务器错误,请联系客服或者稍后再试';
$this->errorCode=999;
$this->recordErrorLog($e);
}
}
$result = [
'error_code' => $this->errorCode,
'msg' => $this->msg,
'request_url' => request()->url()
];
return json($result, $this->code);
}
//记录日志
public function recordErrorLog(Exception $e){
Log::record($e->getMessage(),'error');
}
}
BaseException.php
<?php
namespace app\lib\exception;
use think\Exception;
use Throwable;
class BaseException extends Exception
{
public $code = 400;
public $msg = 'invalid parameters';
public $errorCode = 999;
public $paramsEnum = [];
public $shouldToClient = true;
public function __construct($params=[], $type=0)
{
if(!is_array($params)){
return;
}
if(array_key_exists('code',$params)){
$this->code = $params['code'];
}
if(array_key_exists('msg',$params)){
$this->msg = $params['msg'];
}
if(array_key_exists('errorCode',$params)){
$this->errorCode = $params['errorCode'];
}
if( $type ){
$params = $this->paramsEnum[ $type ];
$this->errorCode = $params['error_code'];
$this->msg = $params['msg'];
}
}
}
使用
1、在app目录下的provider.php文件中绑定异常处理类,
坑1:如果按照开发手册来写的话,总是不会走自定义异常,报错500
解决方法如下代码
<?php
use app\lib\exception\ExceptionHandle;
use app\Request;
// 容器Provider定义文件
return [
'think\Request' => Request::class,
'think\exception\Handle' => ExceptionHandle::class,
];
2、在app\lib\exception下新建异常处理类,例:
新建ActivityException.php代码如下
<?php
namespace app\lib\exception;
class ActivityException extends BaseException{
public $code = 400;
public $msg = 'activity is error';
public $errorCode = 10700; // 10700-10799
public $paramsEnum = [
1 => ['error_code'=>10701, 'msg'=>'活动添加失败,请重试~'],
2 => ['error_code'=>10702, 'msg'=>'活动添加失败,请重试'],
3 => ['error_code'=>10703, 'msg'=>'票据规格添加,请重试'],
4 => ['error_code'=>10704, 'msg'=>'活动不存在'],
5 => ['error_code'=>10705, 'msg'=>'不可跨账号操作~'],
6 => ['error_code'=>10706, 'msg'=>'活动不存在或已下架~'],
7 => ['error_code'=>10707, 'msg'=>'票据不存在~'],
8 => ['error_code'=>10708, 'msg'=>'该票据已售罄,请更换其他规格~'],
9 => ['error_code'=>10709, 'msg'=>'活动名额已满,亲下次早来哦~'],
10 => ['error_code'=>10710, 'msg'=>'下单失败,请重试~']
];
public function __construct($params=[],$type=0)
{
parent::__construct($params, $type);
}
}
3、使用时引入ActivityException,可使用定义好的抛出异常类型,也可以自定义抛出异常信息
throw new ActivityException([],1);
结果

返回Json信息