异常处理
系统产生的异常和错误都是程序的隐患,要尽早排除和解决,而不是掩盖。对于应用自己抛出的异常则做出相应的捕获处理
我们在编写代码的时候通常会使用流程语句,当然我们也可以把捕获异常当成流程与就来使用
Tp在调试模式下展示异常页面,显示具体细节,而在部署模式下,仅显示错误信息提示,这么做是为了安全考虑。我们可以手动捕获异常,如果工程量小的情况下可以,但是如果需要捕获异常的地方有很多的话,岂不是要写很多重复的代码,虽然利用公共方法可以解决重复问题,但这不是最优解。系统支持异常处理由开发者自定义类进行接管,需要在应用配置文件app.php中配置参数exception_handle,下面就举例Api接口的异常处理类。
配置异常处理handle类
在应用配置文件app.php
'exception_handle' => 'app\common\exception\handler\ApiExceptionHandler',
定义异常基类
定义app\common\exception\BaseException.php
namespace app\common\exception;
use think\Exception;
class BaseException extends Exception
{
//http 状态码
public $code = 500;
//错误码
public $errCode = 1000;
//错误消息
public $errMsg = '服务器内部错误';
public function __construct($error = [])
{
if( array_key_exists('code',$error) )
$this->code = $error['code'];
if( array_key_exists('errCode',$error) )
$this->errCode = $error['errCode'];
if( array_key_exists('errMsg',$error) )
$this->errMsg = $error['errMsg'];
}
}
定义异常处理Handle类
我们开发Api的时候,经常会验证参数安全,以及手动抛出可视性错误,那么类似这些前端提示性错误可以直接返回前端,并且不需要记录日志。当然如果在开发调试模式的话,可以交给系统处理异常,如果不是开发调试模式,没必要显示具体的错误,比如返回给前端一大串英文错误信息,客户看了一脸懵逼,他也不知道具体错在哪了,交互非常不好,因为客户端根本不关心这些信息。像这种情况,统一返回给客户端提示说服务器内部错误(大部分是我们代码的问题),然后记录日志,由后端人员再去检查代码,处理好完备的逻辑。
定义app\common\exception\handler\ApiExceptionHandler.php
namespace app\common\exception\handler;
use app\common\exception\BaseException;
use Exception;
use think\exception\Handle;
use think\facade\Env;
use think\facade\Log;
class ApiExceptionHandler extends Handle
{
//http 状态码
private $code;
//错误消息
private $errMsg;
//错误码
private $errCode;
public function render(Exception $e)
{
//表示需要显示具体错误消息的异常类,并不需要记录日志
if($e instanceof BaseException){
$this->code = $e->code;
$this->errMsg = $e->errMsg;
$this->errCode = $e->errCode;
}else{
//获取调试信息,如果处于调试状态,则显示具体错误信息,否则统一返回服务器错误消息,并记录日志
$appDebug = Env::get('app_debug',false);
//交给系统处理错误
if( $appDebug ){
return parent::render($e);
}
$this->code = 500;
$this->errCode = 9999;
$this->errMsg = '服务器内部错误';
//记录日志
$this->recordLog($e);
}
$data = [
'msg' => $this->errMsg,
'code' => $this->errCode,
'data' => '',
];
return json()->data($data)->code($this->code);
}
/**
* 记录错误日志
* @param Exception $e
*/
public function recordLog(Exception $e)
{
$message = $e->getMessage();
Log::record($message,'error');
}
}
至此,异常处理已差不多完成,剩下的就是在实际逻辑中抛出异常,就像上面说的类似流程控制似的,抛出异常的时候就相当于终止了程序,返回给前端错误提示。
本作品采用《CC 协议》,转载必须注明作者和本文链接
趁还没掉光,赶紧给每根头发起个名字吧~