成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何優(yōu)雅的設計PHP異常

wing324 / 3605人閱讀

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

前言

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

異常的類別

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

結(jié)構如下:

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

什么時候才需要拋異常

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

如何捕獲異常

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

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

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

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

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

場景描述

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

構建約束條件 登錄

入?yún)ⅲ?/p>

用戶手機號

用戶密碼

手機驗證碼

約束:

用戶手機號不能為空,格式正確,且此用戶確實是存在的

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

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

注冊

入?yún)ⅲ?/p>

用戶手機號

用戶密碼

密碼二次確認

手機驗證碼

約束:

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

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

二次密碼要跟密碼一樣

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

忘記密碼:

入?yún)ⅲ?/p>

用戶手機號

用戶新密碼

密碼二次確認

手機驗證碼

約束:

用戶手機號不能為空,格式正確,且此用戶確實是存在的

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

二次密碼要跟密碼一樣

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

獲取手機驗證碼

入?yún)ⅲ?/p>

用戶手機號

約束:

用戶手機號不能為空,格式正確

一分鐘內(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 錯誤信息
     */
    private $msg;
     
    /**
     * @var $code 錯誤碼
     */
    private $code;

    # 自定義錯誤異常需要重寫tp5父類的這個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記錄錯誤日志
            return parent::render($e)
        }
        
        $result = [
            "code" => $this->code,
            "msg" => $this->msg
        ];
        # 返回給前端
        return json($result, $this->httpStatusCode);
}
創(chuàng)建基礎的異常類
# 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ù)錯誤異常類

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;
}
如何使用

我們先來看看登錄這個功能

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28486.html

相關文章

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

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

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

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

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

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

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

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

    phpmatt 評論0 收藏0
  • Laravel 程序架構設計思路:使用動作類

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

    Caicloud 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<