鍍金池/ 問答/Java  PHP/ 對于Api開發(fā)的疑問,求大家解除疑惑

對于Api開發(fā)的疑問,求大家解除疑惑

在開發(fā)api的時候是否可以用throw new 拋出http 異常;
這樣的話感覺就很簡單了,比如用戶沒有登錄就直接拋出異常,之后的代碼就不會執(zhí)行;

自定義了一個http異常來接管框架的異常處理! 框架是tp5

還是說用傳統(tǒng)的返回數(shù)組再上一層調(diào)用的時候判斷更好些?

<?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狀態(tài)嗎
    private $msg;   //錯誤具體信息
    private $data;  //錯誤碼
    private $code;

    public function render(Exception $e)
    {
        //如果是自定義異常處理類
        if ($e instanceof Base) {
            $this->status = $e->status;     //給狀態(tài)嗎賦值
            $this->msg = $e->msg;       //給錯誤信息賦值
            $this->data = $e->data;   //給錯誤碼復(fù)制
            $this->code = $e->code;   //給錯誤碼復(fù)制
        } else {
            if (\think\facade\Config::get('app_debug')) {
                //如果在測試環(huán)境下直接拋出異常
                return parent::render($e);
            } else {
                //如果是在生產(chǎn)環(huán)境下將直接拋出服務(wù)器錯誤的異常
                $this->status = 500;
                $this->msg = "服務(wù)器內(nèi)部錯誤";
                $this->data = '';
            }
            //如果是服務(wù)器錯誤 那么就將錯誤記錄到日志里面
            $this->recordErrorLog($e);
        }
        //返回JSON結(jié)構(gòu)的數(shù)據(jù)
        $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狀態(tài)嗎
    public $msg = '參數(shù)錯誤';    //錯誤具體信息
    public $data = [];      //錯誤碼
    public $code = 200;


    /**
     * @desc 構(gòu)造函數(shù) 初始化成員變量
     * BaseException constructor.
     * @param array $params
     * @throws Exception
     */
    public function __construct($params = [])
    {
        //如果傳入的參數(shù)不是數(shù)組就直接拋出異常
        if(!is_array($params)){
            throw new Exception('參數(shù)必須是數(shù)組');
        }

        //判斷數(shù)組中是否存在下標(biāo)是code的值
        //如果存在就給成員變量賦值
        if(array_key_exists('status',$params)){
            $this->status = $params['status'];
        }

        //判斷數(shù)組中是否存在下標(biāo)是 msg 的值
        //如果存在就給成員變量賦值
        if(array_key_exists('msg',$params)){
            $this->msg = $params['msg'];
        }

        //判斷數(shù)組中是否存在下標(biāo)是 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 = "沒有數(shù)據(jù)!";
    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'];
    }
回答
編輯回答
未命名

API拋出自定義異常處理 返回 http200 的json 給前端就好了

2017年10月19日 15:14
編輯回答
薄荷糖

API拋出自定義異常處理 返回 httpcode 200 的 json 返回的只要前端能處理就可以 xml也是可以的

2018年1月22日 21:27
編輯回答
落殤

不能直接拋出異常啊,你要返回客戶端可以識別的信息才行,包括 http code,錯誤碼,錯誤信息,不然你倒是爽利了,客戶端無法判斷錯誤……

2017年9月6日 02:33
編輯回答
久愛她

拋出自定義異常即可。
異常捕獲那里判斷一下如果是自定義異常,就返回{"errmsg":自定義異常消息,"errcode":異常code}

如果不是自定義異常被捕獲,證明程序出錯了。這時候需要返回一個服務(wù)器繁忙給外部,然后記錄日志

2017年5月21日 06:26
編輯回答
憶往昔

拋自定義異常

2017年7月20日 09:05
編輯回答
失心人

要使 之后的代碼就不會執(zhí)行,可以return

2018年3月6日 02:39
編輯回答
練命

送分題,拋出異常,同時如果內(nèi)容只有 statusmsg 的話建議直接使用 Exception 的內(nèi)置屬性 codemessage,然后在接口入口 catch 的時候做返回格式處理

2017年12月26日 07:02