摘要:現(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
摘要:好了,終于寫完了深入理解異常和錯(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)行基...
摘要:前言轉(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ù)組...
摘要:關(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....
摘要:區(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)非常成熟;以前后端人員瞧不起前端人員,...
摘要:一個(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)...
閱讀 3011·2021-11-24 09:39
閱讀 2928·2021-09-29 09:34
閱讀 3658·2021-09-24 10:23
閱讀 1817·2021-09-22 15:41
閱讀 1752·2019-08-30 15:55
閱讀 3558·2019-08-30 13:58
閱讀 2684·2019-08-30 13:11
閱讀 1714·2019-08-29 12:31