亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

如何優(yōu)雅的設(shè)計(jì)PHP異常

wing324 / 3629人閱讀

摘要:現(xiàn)在我就用框架來進(jìn)行實(shí)戰(zhàn)下在實(shí)際業(yè)務(wù)中是如何優(yōu)雅的使用異常的場景描述選擇一個(gè)比較簡單的業(yè)務(wù)場景,以登錄模塊為例,用戶在移動(dòng)端進(jìn)行登錄時(shí),需要進(jìn)行登錄,注冊,忘記密碼,獲取手機(jī)驗(yàn)證碼等接口。

前言

剛開始接觸PHP的時(shí)候沒有意識(shí)到異常的重要性,有時(shí)候出問題很難精確的找到問題點(diǎn),正確的處理異常也是一門學(xué)問

異常的類別

PHP7異常做了很多變動(dòng),異常類 Exception 和錯(cuò)誤類 Error 都實(shí)現(xiàn)了 Throwable 接口

結(jié)構(gòu)如下:

Throwable

Error

ArithmeticError

DivisionByZeroError

AssertionError

ParseError

TypeError

ArgumentCountError

Exception

ClosedGeneratorException

DOMException

ErrorException

IntlException

LogicException

BadFunctionCallException

BadMethodCallException

DomainException

InvalidArgumentException

LengthException

OutOfRangeException

PharException

ReflectionException

RuntimeException

OutOfBoundsException

OverflowException

PDOException

RangeException

UnderflowException

UnexpectedValueException

SodiumException

什么時(shí)候才需要拋異常

這個(gè)一切從實(shí)際出發(fā),如果你覺得你的代碼可能會(huì)出現(xiàn)問題,就可以進(jìn)行拋出異常

如何捕獲異常

PHP中使用 try...catch...finally 捕獲異常

public function test()
{
    try {
        //可能出錯(cuò)的代碼邏輯
    } catch (Exception $e) {
        echo $e->getMessage();
    } finally {
        //todo
    }
}

如果不確定出現(xiàn)異常還是錯(cuò)誤,可以直接捕獲 Throwable 異常

public function test()
{
    try {
        //可能出錯(cuò)的代碼邏輯
    } catch (Throwable $e) {
        echo $e->getMessage();
    } finally {
        //todo
    }
}
業(yè)務(wù)場景實(shí)戰(zhàn)

現(xiàn)在的項(xiàng)目很多都是前后端分離、restful風(fēng)格接口的設(shè)計(jì)進(jìn)行開發(fā)?,F(xiàn)在我就用tp5框架來進(jìn)行實(shí)戰(zhàn)下在實(shí)際業(yè)務(wù)中是如何優(yōu)雅的使用異常的

場景描述

選擇一個(gè)比較簡單的業(yè)務(wù)場景,以登錄模塊為例,用戶在移動(dòng)端進(jìn)行登錄時(shí),需要進(jìn)行登錄,注冊,忘記密碼,獲取手機(jī)驗(yàn)證碼等接口。

構(gòu)建約束條件 登錄

入?yún)ⅲ?/p>

用戶手機(jī)號(hào)

用戶密碼

手機(jī)驗(yàn)證碼

約束:

用戶手機(jī)號(hào)不能為空,格式正確,且此用戶確實(shí)是存在的

密碼不能為空,密碼格式正確

手機(jī)驗(yàn)證碼不能為空,且是在有效期內(nèi)的

注冊

入?yún)ⅲ?/p>

用戶手機(jī)號(hào)

用戶密碼

密碼二次確認(rèn)

手機(jī)驗(yàn)證碼

約束:

用戶手機(jī)號(hào)不能為空,格式正確,且此用戶確實(shí)是新用戶,系統(tǒng)不存在此用戶信息

密碼不能為空,密碼格式正確

二次密碼要跟密碼一樣

手機(jī)驗(yàn)證碼不能為空,且是在有效期內(nèi)的

忘記密碼:

入?yún)ⅲ?/p>

用戶手機(jī)號(hào)

用戶新密碼

密碼二次確認(rèn)

手機(jī)驗(yàn)證碼

約束:

用戶手機(jī)號(hào)不能為空,格式正確,且此用戶確實(shí)是存在的

密碼不能為空,密碼格式正確

二次密碼要跟密碼一樣

手機(jī)驗(yàn)證碼不能為空,且是在有效期內(nèi)的

獲取手機(jī)驗(yàn)證碼

入?yún)ⅲ?/p>

用戶手機(jī)號(hào)

約束:

用戶手機(jī)號(hào)不能為空,格式正確

一分鐘內(nèi)只能獲取一次

自定義tp5異常 創(chuàng)建異常處理Handle類
# applicationlibexceptionExceptionHandle

namespace applicationlibexception;

use Exception;
use thinkexceptionHandle;

class ExceptionHandle extends Handle
{
    /**
     * @var $httpStatusCode http狀態(tài)碼
     */
    private $httpStatusCode;
    
    /**
     * @var $msg 錯(cuò)誤信息
     */
    private $msg;
     
    /**
     * @var $code 錯(cuò)誤碼
     */
    private $code;

    # 自定義錯(cuò)誤異常需要重寫tp5父類的這個(gè)render方法
    public function render(Exception $e)
    {
        if ($e instanceof BaseException) {
            # 自定義異常
            $this->httpStatusCode = $e->httpStatusCode;
            $this->msg = $e->msg;
            $this->code = $e->code;
        } else {
            # 系統(tǒng)異常
            //TODO記錄錯(cuò)誤日志
            return parent::render($e)
        }
        
        $result = [
            "code" => $this->code,
            "msg" => $this->msg
        ];
        # 返回給前端
        return json($result, $this->httpStatusCode);
}
創(chuàng)建基礎(chǔ)的異常類
# applicationlibexceptionBaseException

namespace applicationlibexception;

use thinkException;

# 異常類需要繼承tp5的異?;?class BaseException extends Exception
{
    public $httpStatusCode = 401;

    public $msg = "parameter error";
    
    public $code = 10000;
    
    public function __construct(array $params = [])
    {
        if (array_key_exists("httpStatusCode", $params)) {
            $this->httpStatusCode = $params["httpStatusCode"];
        }
        
        if (array_key_exists("msg", $params)) {
            $this->msg = $params["msg"];
        }
        
        if (array_key_exists("code", $params)) {
            $this->code = $params["code"];
        }
        
    }
}
創(chuàng)建具體異常類

參數(shù)錯(cuò)誤異常類

namespace applibexception;

class ParameterException extends BaseException
{
    public $httpStatusCode = 200;

    public $msg = "parameter error";

    public $code = 10000;
}

用戶不存在

class UserNotExistsException extends BaseException
{
    public $httpStatusCode = 200;

    public $msg = "user is not exists";

    public $code = 20000;
}
如何使用

我們先來看看登錄這個(gè)功能

傳統(tǒng)處理方法
public function login($phone, $password)
{
    $uid = $this->getUidByPhone($phone);
    if (!$uid) {
        # 進(jìn)行處理
    }
}
通過異常處理
public function login($phone, $password)
{
    $uid = $this->getUidByPhone($phone);
    if (!$uid) {
        # 拋出異常,返回給前端
        throw new UserNotExistsException();
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/28486.html

相關(guān)文章

  • 深入理解PHP異常和錯(cuò)誤處理(6)PHP如何優(yōu)雅處理錯(cuò)誤

    摘要:好了,終于寫完了深入理解異常和錯(cuò)誤處理這個(gè)系列了,可能大家平時(shí)使用框架開發(fā),基本上不用考慮錯(cuò)誤和異常,閱讀,評(píng)論轉(zhuǎn)發(fā)數(shù)量不盡人意,也可能自己水平有限本文由甲爪廣告聯(lián)盟整理編輯 前言:有錯(cuò)就改,錯(cuò)誤光屏蔽是不行的,還需要對(duì)錯(cuò)誤進(jìn)行處理和記錄。 內(nèi)容概要: 1、頂層錯(cuò)誤處理器的介紹2、示例代碼 一、頂層錯(cuò)誤處理器的介紹 php在處理錯(cuò)誤的時(shí)候,可以簡單的使用exit()和die()來進(jìn)行基...

    Alliot 評(píng)論0 收藏0
  • PHPer這樣寫代碼也許更優(yōu)雅

    摘要:前言轉(zhuǎn)眼間成為一名已經(jīng)快整整兩年了,在這期間也對(duì)如何寫出可讀性高,便于擴(kuò)展的代碼有了一些自己的想法。所以,我們在寫上游代碼時(shí)異常直接拋出即可。通常這樣可以很大程度的提高效率和代碼復(fù)用。 前言 轉(zhuǎn)眼間成為一名PHPer已經(jīng)快整整兩年了,在這期間也對(duì)如何寫出可讀性高,便于擴(kuò)展的代碼有了一些自己的想法。 使用引用 場景一:遍歷一個(gè)數(shù)組獲取新的數(shù)據(jù)結(jié)構(gòu) 也許你會(huì)這樣寫: // 申明一個(gè)新的數(shù)組...

    kidsamong 評(píng)論0 收藏0
  • 帶你拋出優(yōu)雅處理系統(tǒng)異常

    摘要:關(guān)于拋出異常如在我的上一篇文中所說的一樣在接口的設(shè)計(jì)中接口的返回的數(shù)據(jù)是非常重要的例如無法避免的等等這些都是要命的錯(cuò)誤同時(shí)還有一個(gè)極大的問題就是在新增模塊中例如我最近需要新增一個(gè)的分詞查詢模塊這個(gè)在添加索引刪除索引等等操作的時(shí)候是非常容易導(dǎo) showImg(http://pqykjwm6s.bkt.clouddn.com/Grassland_Scenery_by_Shi_Yuejun....

    susheng 評(píng)論0 收藏0
  • 分布式之API接口返回格式如何優(yōu)雅設(shè)計(jì)?

    摘要:區(qū)間表示參數(shù)錯(cuò)誤區(qū)間表示用戶錯(cuò)誤區(qū)間表示接口異常這樣前端開發(fā)人員在得到返回值后,根據(jù)狀態(tài)碼就可以知道,大概什么錯(cuò)誤,再根據(jù)相關(guān)的信息描述,可以快速定位。享學(xué)課堂特邀作者:老顧前言在移動(dòng)互聯(lián)網(wǎng),分布式、微服務(wù)盛行的今天,現(xiàn)在項(xiàng)目絕大部分都采用的微服務(wù)框架,前后端分離方式,(題外話:前后端的工作職責(zé)越來越明確,現(xiàn)在的前端都稱之為大前端,技術(shù)棧以及生態(tài)圈都已經(jīng)非常成熟;以前后端人員瞧不起前端人員,...

    phpmatt 評(píng)論0 收藏0
  • Laravel 程序架構(gòu)設(shè)計(jì)思路:使用動(dòng)作類

    摘要:一個(gè)動(dòng)作類,應(yīng)該有一個(gè)能夠說明其功能的名字,比如等。如果需要對(duì)我們的動(dòng)作類實(shí)現(xiàn)某種適配器模式,這是非常方便的。使用單動(dòng)作類的好處小巧而單一的邏輯域能夠防止代碼重復(fù)并提高代碼的可重用性,保持穩(wěn)定。易于針對(duì)各種場景進(jìn)行獨(dú)立測試。 showImg(https://segmentfault.com/img/remote/1460000015208092); 當(dāng)我們談?wù)摰綉?yīng)用程序的架構(gòu)的時(shí)候,經(jīng)...

    Caicloud 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<