对于Api开发的疑问,求大家解除疑惑

发布于 2022-09-07 19:53:10 字数 3668 浏览 18 评论 0

在开发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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

眼藏柔 2022-09-14 19:53:10

送分题,抛出异常,同时如果内容只有 statusmsg 的话建议直接使用 Exception 的内置属性 codemessage,然后在接口入口 catch 的时候做返回格式处理

挽梦忆笙歌 2022-09-14 19:53:10

抛自定义异常

饮惑 2022-09-14 19:53:10

要使 之后的代码就不会执行,可以return

撑一把青伞 2022-09-14 19:53:10

不能直接抛出异常啊,你要返回客户端可以识别的信息才行,包括 http code,错误码,错误信息,不然你倒是爽利了,客户端无法判断错误……

猫瑾少女 2022-09-14 19:53:10

API抛出自定义异常处理 返回 http200 的json 给前端就好了

终陌 2022-09-14 19:53:10

API抛出自定义异常处理 返回 httpcode 200 的 json 返回的只要前端能处理就可以 xml也是可以的

许你一世情深 2022-09-14 19:53:10

抛出自定义异常即可。
异常捕获那里判断一下如果是自定义异常,就返回{"errmsg":自定义异常消息,"errcode":异常code}

如果不是自定义异常被捕获,证明程序出错了。这时候需要返回一个服务器繁忙给外部,然后记录日志

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文