一、异常捕获和处理
模拟 model层出现了异常,在controller层捕获异常,并给前端返回json格式异常信息
- 捕获model层异常,并给前端返回json格式异常信息
在controller层 application\api\controller\Login.php 中
<?php
namespace app\api\controller;
use app\api\model\LoginModel;
use think\Exception;
class Login
{
public function postInfo($name,$pwd)
{
try {
$login_info = LoginModel::getLoginInfo($name,$pwd);
// throw new Exception('controller异常了哟');
}catch (Exception $exc){
$code = 400;
$error = [
'error_code'=>'10001',
'msg'=>$exc->getMessage()
];
return json($error,$code);
}
}
}
- 模拟抛出异常
在model层 application\api\model\LoginModel.php 中
<?php
namespace app\api\model;
use think\Exception;
class LoginModel
{
public static function getLoginInfo($name,$pwd){
throw new Exception('model异常了哟');
}
}
二、全局异常捕获处理
捕获所有异常,统一处理后,返回json格式
1. 定义 application\exception\BaseException.php 异常处理基类
定义默认的异常处理参数
<?php
namespace app\exception;
use think\Exception;
class BaseException extends Exception
{
public $code = 400;
public $msg = '错误请求';
public $errorCode = 1000;
/**
* @param array $params 参数包含code、msg和errorCode,不允许空值
*/
public function __construct($params=[])
{
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'];
}
}
}
2. 定义 application\exception\ExceptionHandler.php 全局异常捕获处理,并配置生效
- 定义全局异常处理类
捕获异常并返回json格式的异常信息,服务器内部错误返回500,其他异常按照自定义的异常信息返回
<?php
namespace app\exception;
use Exception;
use think\exception\Handle;
class ExceptionHandler extends Handle
{
protected $code;
protected $msg;
protected $errorCode;
public function render(Exception $e)
{
if ($e instanceof BaseException) {
$this->code = $e->code;
$this->msg = $e->msg;
$this->errorCode = $e->errorCode;
}else{
$this->code = 500;
$this->msg = '服务器内部错误';
$this->errorCode = 1;
}
$result = [
'msg' => $this->msg,
'error_code' => $this->errorCode,
];
return json($result,$this->code);
}
}
- 把全局异常处理类配置到 application\config.php
exception_handle 属性值:自定义的全局异常处理类的命名空间\全局异常处理类名称
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle' => 'app\exception\ExceptionHandler',
3. 定义 application\exception\LoginException.php 异常处理类
为全局异常处理赋值
<?php
namespace app\exception;
class LoginException extends BaseException
{
public $code = 404;
public $msg = '未找到指定页面';
public $errorCode = 1000;
}
4. 使用异常自定义的异常处理
在控制层 application\api\controller\Login.php 中,抛出异常
<?php
namespace app\api\controller;
use app\exception\LoginException;
use think\Exception;
class Login
{
public function postInfo($name,$pwd)
{
// throw new Exception('异常'); // 触发服务器内部错误异常,状态码 500
throw new LoginException('model 丢失'); // 触发自定义异常
}
}
三、异常信息记录到日志
thinkphp5.0 会自动将异常信息记录到日志
日志配置文件:config.php
日志存储目录:runtime\log
日志指向配置,在 thinkphp\base.php 中 配置新路径可改变日志的存储位置
defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS);
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);
网友评论