優(yōu)勢(shì):
1.異常處理通常是防止未知錯(cuò)誤產(chǎn)生所采取的處理措施。異常處理的好處是不用再絞盡腦汁去考慮各種錯(cuò)誤随夸,這為處理某一類(lèi)錯(cuò)誤提供了一個(gè)很有效的方法,使編程效率大大提高。
2.自定義拋出異常的好處绷跑,避免if else嵌套,增強(qiáng)代碼可讀性凡资,返回給前端一個(gè)簡(jiǎn)化的json信息砸捏,進(jìn)行相應(yīng)處理。
TP6實(shí)例
在app目錄下新建lib\exception文件夾
在文件夾下新建ExceptionHandle.php隙赁,BaseException.php
ExceptionHandle.php代碼垦藏,重寫(xiě)render
<?php
namespace app\lib\exception;
use think\Exception;
use think\exception\Handle;
use think\Log;
use think\Response;
use Throwable;
/**
* 應(yīng)用異常處理類(lèi)
*/
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='服務(wù)器錯(cuò)誤,請(qǐng)聯(lián)系客服或者稍后再試';
$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文件中綁定異常處理類(lèi)伞访,
坑1:如果按照開(kāi)發(fā)手冊(cè)來(lái)寫(xiě)的話(huà)掂骏,總是不會(huì)走自定義異常,報(bào)錯(cuò)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下新建異常處理類(lèi)弟灼,例:
新建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'=>'活動(dòng)添加失敗,請(qǐng)重試~'],
2 => ['error_code'=>10702, 'msg'=>'活動(dòng)添加失敗冒黑,請(qǐng)重試'],
3 => ['error_code'=>10703, 'msg'=>'票據(jù)規(guī)格添加田绑,請(qǐng)重試'],
4 => ['error_code'=>10704, 'msg'=>'活動(dòng)不存在'],
5 => ['error_code'=>10705, 'msg'=>'不可跨賬號(hào)操作~'],
6 => ['error_code'=>10706, 'msg'=>'活動(dòng)不存在或已下架~'],
7 => ['error_code'=>10707, 'msg'=>'票據(jù)不存在~'],
8 => ['error_code'=>10708, 'msg'=>'該票據(jù)已售罄,請(qǐng)更換其他規(guī)格~'],
9 => ['error_code'=>10709, 'msg'=>'活動(dòng)名額已滿(mǎn)薛闪,親下次早來(lái)哦~'],
10 => ['error_code'=>10710, 'msg'=>'下單失敗辛馆,請(qǐng)重試~']
];
public function __construct($params=[],$type=0)
{
parent::__construct($params, $type);
}
}
3、使用時(shí)引入ActivityException豁延,可使用定義好的拋出異常類(lèi)型昙篙,也可以自定義拋出異常信息
throw new ActivityException([],1);
結(jié)果
返回Json信息