成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

一次和前端的相互甩鍋的問題記錄

bergwhite / 3351人閱讀

摘要:如果沒有要求,前端直接展示后端返回的錯(cuò)誤消息。為了統(tǒng)一異常處理,一般公司的做法都是統(tǒng)一返回一套數(shù)據(jù)格式,碼,代表正常,其他表示異常。那么前端處理異常的邏輯這次的問題就是走到的分支了。和前端討論了下,確定了解法。

背景

我們?cè)贏PP上有個(gè)功能,需要獲取用戶當(dāng)前定位,然后當(dāng)用戶關(guān)閉了GPS后,沒有獲取到用戶定位,會(huì)觸發(fā)一個(gè)bug,彈窗內(nèi)容如下。

問題分析

這個(gè)問題的直接原因就是移動(dòng)端的值取不到,導(dǎo)致沒有給變量賦值,就將"undefined"傳給了后端,后端的這個(gè)值定義的Integer,類型轉(zhuǎn)換失敗,報(bào)錯(cuò)。

深層原因是異常處理機(jī)制有問題,于是后端和前端開始撕逼了

前端觀點(diǎn): 后端代碼太不健壯了, 就算前端傳錯(cuò)了,也應(yīng)該具備容錯(cuò)性;此外APP是有版本的,就算hotfix,用戶也不一定升級(jí),上一版本用戶還是會(huì)有問題,所以這種問題盡量是后端來修復(fù)。

后端觀點(diǎn):前端沒有異常兜底機(jī)制,用戶不應(yīng)該看到任何這種程序異常。對(duì)于有定制需求的異常,報(bào)特定異常,沒有應(yīng)該顯示通用異常,比如彈窗"服務(wù)不可用"。另外這種屬于http請(qǐng)求層面的約束,前端不遵從約束,還來怪我。我后端框架層面就給你攔截了,沒到業(yè)務(wù)代碼。

雙方說的都好有道理,誰也說服不了誰。但是關(guān)于目標(biāo)大家達(dá)成一致:堅(jiān)決不能讓用戶看到這種類型的彈窗異常。

既然說服不了對(duì)方,就只能從更深入的分析問題,看看更合理的解法

通用異常的處理方式

http通常錯(cuò)誤有

4開頭:客戶端參數(shù)有問題,需要后端提供debug信息。理論上應(yīng)該只是聯(lián)調(diào)的時(shí)候會(huì)出現(xiàn),但是實(shí)際上不一定(這不就打臉了嗎)

5開頭:服務(wù)器端有錯(cuò)誤,客戶端有統(tǒng)一提供的異常處理

2開頭:業(yè)務(wù)異常,如果有UI要求,后端返回一個(gè)code碼,前端根據(jù)code碼,展示UI。如果沒有UI要求,前端直接展示后端返回的錯(cuò)誤消息。

為了統(tǒng)一異常處理,一般公司的做法都是API統(tǒng)一返回一套數(shù)據(jù)格式,

{
    "error_code": "xx", // code碼,1代表正常,其他表示異常。
    "error_msg": "xx" // msg,錯(cuò)誤提示消息
    "data": "xx" // 正常數(shù)據(jù)
}

我們也是,并且將4開頭的都統(tǒng)一處理成這套統(tǒng)一的數(shù)據(jù)格式。

那么前端處理異常的邏輯

這次的問題就是走到2的分支了。

前后端都沒做錯(cuò),問題是后端對(duì)于異常模型的抽象有問題,客戶端參數(shù)有問題,需要后端提供debug信息,而不是給用戶展示的錯(cuò)誤信息。

其實(shí)服務(wù)端對(duì)于異常就分三種

客戶端參數(shù)有問題的異常(前端需要debug信息和錯(cuò)誤msg信息)

需要用戶知道的業(yè)務(wù)異常,前端需要根據(jù)code展示的(前端需要code碼)

通用的服務(wù)端異常,包裝成消息給前端。(前端需要錯(cuò)誤msg信息)

解法

分析清楚了問題后,就有了解法。

解法1:錯(cuò)誤消息和debug消息分離,返回的API統(tǒng)一格式中增加一種字段。debug_msg 給開發(fā)看的,error_msg 還是給用戶看的

解法2:定義幾個(gè)枚舉code。作為開發(fā)的約定

code error_msg 參數(shù)錯(cuò)誤含義
010000 系統(tǒng)錯(cuò)誤[010000] 請(qǐng)求方法不支持
010001 系統(tǒng)錯(cuò)誤[010001] 缺少路徑參數(shù)
010002 系統(tǒng)錯(cuò)誤[010002] 缺少必須的請(qǐng)求參數(shù)
010003 系統(tǒng)錯(cuò)誤[010003] 類型不匹配
010004 系統(tǒng)錯(cuò)誤[010004] 請(qǐng)求體異常
010005 系統(tǒng)錯(cuò)誤[010005] // 參數(shù)校驗(yàn)異常(body 或 param)
010006 系統(tǒng)錯(cuò)誤[010006] 參數(shù)綁定異常(表單)

解法1定義比較清晰,但是為了這種corner case增加了一個(gè)字段的開銷,網(wǎng)絡(luò)傳輸代價(jià)高了。另外還需要前端配合更改,改動(dòng)成本比較大。

解法2兼容了現(xiàn)在的實(shí)現(xiàn),前端不用更改,但是對(duì)于客戶端參數(shù)有問題這種錯(cuò)誤提醒不是很友好,不能向前端顯示具體的參數(shù)錯(cuò)誤了。只能打日志。

和前端討論了下,確定了解法2。

總結(jié)

所以這個(gè)問題,最后的解法

前端獲取不到定位時(shí),將undefined這個(gè)變量賦值

后端針對(duì)移動(dòng)端這個(gè)服務(wù),改動(dòng)了異常處理機(jī)制

@RestControllerAdvice
public class ApiStandardException {
    private static final String ERROR_MSG = "系統(tǒng)錯(cuò)誤";
 
    @ExceptionHandler(value = Exception.class)
    public ResponseEntity handle(final Exception ex, final WebRequest request)
            throws Exception {

        try {
            if (ex instanceof HttpRequestMethodNotSupportedException) {
                // 請(qǐng)求方法不支持
                LOG.warn("Request method is not supported");
                throw new BusinessException(WebRequestErrorEnum.METHOD_ERR.getCode(), ERROR_MSG);
            } else if (ex instanceof MissingPathVariableException) {
                LOG.warn("MISSING_PATHVAR" + ex.getMessage());
                // 缺少路徑參數(shù)
                throw new BusinessException(WebRequestErrorEnum.MISSING_PARAM.getCode(), ERROR_MSG);
            } else if (ex instanceof MissingServletRequestParameterException) {
                // 缺少必須的請(qǐng)求參數(shù)
            }
            // 省略其他異常處理

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/74867.html

相關(guān)文章

  • 程序員,職場(chǎng)上請(qǐng)遠(yuǎn)離這種人!

    摘要:隨著微信和的不斷普及,現(xiàn)在微信和留言也已經(jīng)成為了甩鍋?zhàn)C據(jù)的一部分,經(jīng)常郵件里面大量粘貼微信聊天截圖,職場(chǎng)上的宮心斗不比電視劇里面的差。 對(duì)有些職場(chǎng)人來講,甩鍋就是一種生存手段。 01.從大學(xué)打籃球說起 上大學(xué)的時(shí)候喜歡打籃球,然后我又特別喜歡搶籃板,經(jīng)常是跳起來的時(shí)候沒...

    khs1994 評(píng)論0 收藏0
  • 前端開發(fā)流程中一定要注意5個(gè)點(diǎn)!

    摘要:作為一個(gè)老前端給新人們的一些關(guān)于開發(fā)流程上的建議拒絕和設(shè)計(jì)稿沒有封板就要求排期,和產(chǎn)品設(shè)計(jì)充分溝通。雙方還是要找到平衡點(diǎn)確保產(chǎn)品質(zhì)量和上線時(shí)間點(diǎn)的前提下,前端的開發(fā)難度和工作量是合理的。 作為一個(gè)老前端給新人們的一些關(guān)于開發(fā)流程上的建議 1. 拒絕PRD和設(shè)計(jì)稿沒有封板就要求排期,和產(chǎn)品設(shè)計(jì)充分溝通。 前端開發(fā)經(jīng)常會(huì)遇到這樣的情況,項(xiàng)目經(jīng)理莫名奇妙發(fā)了個(gè)會(huì)議邀請(qǐng),然后一股腦把產(chǎn)品下階段...

    王晗 評(píng)論0 收藏0
  • CDN入門了解

    摘要:維基百科的基本工作過程最簡(jiǎn)單的網(wǎng)絡(luò)是由一臺(tái)服務(wù)器和多臺(tái)緩存服務(wù)器構(gòu)成。用戶向緩存服務(wù)器發(fā)起請(qǐng)求,緩存服務(wù)器響應(yīng)用戶請(qǐng)求,將用戶所需內(nèi)容傳送到用戶終端。 前言 這段時(shí)間,在工作中遇到了一個(gè)CDN導(dǎo)致的圖片資源加載的錯(cuò)誤,在排查問題的過程中,發(fā)現(xiàn)自己對(duì)CDN的了解非常的片面,僅僅停留在它能緩存靜態(tài)資源,提升訪問速度的了解中。所以覺得還是非常有必要深入去了解下。 什么是CDN? CDN的全稱...

    wapeyang 評(píng)論0 收藏0
  • CDN入門了解

    摘要:維基百科的基本工作過程最簡(jiǎn)單的網(wǎng)絡(luò)是由一臺(tái)服務(wù)器和多臺(tái)緩存服務(wù)器構(gòu)成。用戶向緩存服務(wù)器發(fā)起請(qǐng)求,緩存服務(wù)器響應(yīng)用戶請(qǐng)求,將用戶所需內(nèi)容傳送到用戶終端。 前言 這段時(shí)間,在工作中遇到了一個(gè)CDN導(dǎo)致的圖片資源加載的錯(cuò)誤,在排查問題的過程中,發(fā)現(xiàn)自己對(duì)CDN的了解非常的片面,僅僅停留在它能緩存靜態(tài)資源,提升訪問速度的了解中。所以覺得還是非常有必要深入去了解下。 什么是CDN? CDN的全稱...

    Gilbertat 評(píng)論0 收藏0
  • Python源碼漫游指南(一)

    摘要:源碼漫游指南一作者秘塔科技算法研究員前幾天發(fā)布了第五屆頂級(jí)語言交互排行榜,語言繼續(xù)穩(wěn)坐第一把交椅,并且相比去年的排行情況,拉開了與第二名的距離去年第二名的排名得分為。包含字節(jié)碼相關(guān)的底層抽象。字節(jié)碼對(duì)象的實(shí)現(xiàn)。源文件執(zhí)行結(jié)束后的清理工作。 Python源碼漫游指南(一) 作者:秘塔科技算法研究員 Qian Wan 前幾天IEEE Spectrum發(fā)布了第五屆頂級(jí)語言交互排行榜,Pyth...

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

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

0條評(píng)論

bergwhite

|高級(jí)講師

TA的文章

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