对于Api开发的疑问,求大家解除疑惑
在开发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'];
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
送分题,抛出异常,同时如果内容只有
status
和msg
的话建议直接使用Exception
的内置属性code
和message
,然后在接口入口catch
的时候做返回格式处理抛自定义异常
要使 之后的代码就不会执行,可以
return
啊不能直接抛出异常啊,你要返回客户端可以识别的信息才行,包括 http code,错误码,错误信息,不然你倒是爽利了,客户端无法判断错误……
API抛出自定义异常处理 返回 http200 的json 给前端就好了
API抛出自定义异常处理 返回 httpcode 200 的 json 返回的只要前端能处理就可以 xml也是可以的
抛出自定义异常即可。
异常捕获那里判断一下如果是自定义异常,就返回
{"errmsg":自定义异常消息,"errcode":异常code}
如果不是自定义异常被捕获,证明程序出错了。这时候需要返回一个
服务器繁忙
给外部,然后记录日志