在开发api的时候是否可以用throw new 抛出http 异常;这样的话感觉就很简单了,比如用户没有登录就直接抛出异常,之后的代码就不会执行;
自定义了一个http异常来接管框架的异常处理! 框架是tp5
还是说用传统的返回数组再上一层调用的时候判断更好些?
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/1/14/014
* Time: 2:56
*/
namespace app\tool\exception;
use app\tool\Tool;
use Exception;
use think\exception\Handle;
use think\Request;
use think\Log;
class ExceptionHandler extends Handle
{
private $status; //HTTP状态吗
private $msg; //错误具体信息
private $data; //错误码
private $code;
public function render(Exception $e)
{
//如果是自定义异常处理类
if ($e instanceof Base) {
$this->status = $e->status; //给状态吗赋值
$this->msg = $e->msg; //给错误信息赋值
$this->data = $e->data; //给错误码复制
$this->code = $e->code; //给错误码复制
} else {
if (\think\facade\Config::get('app_debug')) {
//如果在测试环境下直接抛出异常
return parent::render($e);
} else {
//如果是在生产环境下将直接抛出服务器错误的异常
$this->status = 500;
$this->msg = "服务器内部错误";
$this->data = '';
}
//如果是服务器错误 那么就将错误记录到日志里面
$this->recordErrorLog($e);
}
//返回JSON结构的数据
$response['status'] = $this->status;
$response['msg'] = $this->msg;
$response['data'] = $this->data;
return json($response, $this->code);
}
//写日志
private function recordErrorLog(Exception $e)
{
Log::init([
'type' => 'File',
// 日志保存目录
'path' => LOG_PATH,
// 日志记录级别
'level' => ['error'],
]);
Log::record($e->getMessage(), 'error');
}
}
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/1/14/014
* Time: 2:47
*/
namespace app\tool\exception;
use think\Exception;
class Base extends Exception
{
public $status = 0; //HTTP状态吗
public $msg = '参数错误'; //错误具体信息
public $data = []; //错误码
public $code = 200;
/**
* @desc 构造函数 初始化成员变量
* BaseException constructor.
* @param array $params
* @throws Exception
*/
public function __construct($params = [])
{
//如果传入的参数不是数组就直接抛出异常
if(!is_array($params)){
throw new Exception('参数必须是数组');
}
//判断数组中是否存在下标是code的值
//如果存在就给成员变量赋值
if(array_key_exists('status',$params)){
$this->status = $params['status'];
}
//判断数组中是否存在下标是 msg 的值
//如果存在就给成员变量赋值
if(array_key_exists('msg',$params)){
$this->msg = $params['msg'];
}
//判断数组中是否存在下标是 error_code 的值
//如果存在就给成员变量赋值
if(array_key_exists('data',$params)){
$this->data = $params['data'];
}
if(array_key_exists('code',$params)){
$this->code = $params['code'];
}
}
}
namespace app\tool\exception;
class Http extends Base
{
public $status = 0;
public $data = [];
public $msg = "没有数据!";
public $code = 200;
}
public static function getUid()
{
$token = Request::header('token');
if (null === $token) {
throw new Http(['status' => '-2', 'msg' => '请登录后再操作!']);
}
$result = Cache::get($token);
if (false === $result) {
throw new Http(['status' => '-1', 'msg' => '登陆失效,请重新登录!']);
}
return $result['id'];
}
6 回答
慕盖茨4494581
TA贡献1850条经验 获得超11个赞
送分题,抛出异常,同时如果内容只有 status
和 msg
的话建议直接使用 Exception
的内置属性 code
和 message
,然后在接口入口 catch
的时候做返回格式处理
慕虎7371278
TA贡献1802条经验 获得超4个赞
抛出自定义异常即可。
异常捕获那里判断一下如果是自定义异常,就返回{"errmsg":自定义异常消息,"errcode":异常code}
如果不是自定义异常被捕获,证明程序出错了。这时候需要返回一个服务器繁忙
给外部,然后记录日志
- 6 回答
- 0 关注
- 582 浏览
添加回答
举报
0/150
提交
取消