久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Go錯(cuò)誤處理實(shí)戰(zhàn):掌握%w與errors.Is/As,避免錯(cuò)誤鏈?zhǔn)Э?/h1>

每年Go社區(qū)的“錯(cuò)誤處理大戰(zhàn)”一開打吵到最后的焦點(diǎn)幾乎都落在同一個(gè)問題上到底要不要Wrap錯(cuò)誤就拿我的團(tuán)隊(duì)來說代碼評(píng)審上最常見的一條評(píng)論就是“這里為什么沒加%w”而回復(fù)也高度統(tǒng)一“加了怕鏈太長(zhǎng)不加又怕斷鏈?!边@種擰巴其實(shí)很正?!狦o的錯(cuò)誤處理設(shè)計(jì)哲學(xué)與真實(shí)業(yè)務(wù)系統(tǒng)之間隔著太厚的膠水層語言本身只給了你一個(gè)極簡(jiǎn)接口type error interface { Error() string }可一條錯(cuò)誤從數(shù)據(jù)庫底層一路被拋出API網(wǎng)關(guān)中間還要穿過repository、service、handler好幾個(gè)層次每一層都得做一次莎士比亞式的選擇題To Wrap or Not to Wrap。這篇文章不打算站隊(duì)說“必須全部Wrap”或者“最好別Wrap”我想結(jié)合這些年寫Go的實(shí)際感受把%w、errors.Is、errors.As這些工具到底解決了什么問題、什么時(shí)候加Wrap是真的有信息增益、什么時(shí)候純屬自嗨式包裝講清楚。如果你正在為團(tuán)隊(duì)的錯(cuò)誤處理規(guī)范頭疼或者剛被代碼評(píng)審問住“這里為什么不Wrap”這篇應(yīng)該能給你一個(gè)相對(duì)可落地的判斷框架。1. 老生常談的“err ! nil”怎么就成了社區(qū)年經(jīng)貼1.1 為什么Go寧愿啰嗦也不引入try-catchGo選擇顯式錯(cuò)誤處理是設(shè)計(jì)者對(duì)程序可讀性的一種偏執(zhí)。異常機(jī)制在Java、Python、C#那套體系里非常成熟它能把“正常流程”和“錯(cuò)誤流程”分開但代價(jià)是控制流變得不那么直觀——一個(gè)throw拋出來你根本不知道它會(huì)飛到哪里中間可能被某個(gè)catch吞掉也可能一直穿到最外層。Go設(shè)計(jì)者從一開始就不喜歡這種“隱秘的控制流跳轉(zhuǎn)”他們寧愿讓你在代碼里看到滿屏的if err ! nil也不愿意讓你在log里看到一句干巴巴的Unexpected error然后對(duì)著堆棧猜是誰吞了異常。說白了Go對(duì)錯(cuò)誤的處理方式繼承自C的經(jīng)驗(yàn)錯(cuò)誤就是值它和正常數(shù)據(jù)一樣得顯式傳遞誰要用誰就得接著。函數(shù)簽名(T, error)的約定把“可能失敗”這件事寫在了類型系統(tǒng)里。很多剛轉(zhuǎn)Go的人覺得這規(guī)矩?zé)┤说矣^察下來真正讓團(tuán)隊(duì)崩潰的從來不是if err ! nil多寫了幾行而是錯(cuò)誤出來之后怎么流轉(zhuǎn)、怎么保留上下文、怎么讓上游能感知到錯(cuò)誤的“身份”。這才是每年社區(qū)爭(zhēng)論真正的火藥桶。1.2 Go 1.13把“包裝”扶正了在Go 1.13之前想給錯(cuò)誤附加上下文幾乎全靠字符串拼接fmt.Errorf(xxx: err.Error())。問題是拼完之后原始錯(cuò)誤的所有類型信息全部丟失。你不能對(duì)一個(gè)拼好的字符串調(diào)用errors.Is也不能從一串文本里掏出當(dāng)初那個(gè)*os.PathError或者sql.ErrNoRows。社區(qū)因?yàn)槭懿涣诉@個(gè)所以出現(xiàn)了github.com/pkg/errors這類庫用WithStack、Wrap的方式把堆棧和錯(cuò)誤綁在一起但問題在于每個(gè)庫的約定不同A庫返回的錯(cuò)誤到了B庫沒法統(tǒng)一處理。2019年Go 1.13正式發(fā)布標(biāo)準(zhǔn)庫加入了errors.Is、errors.As、errors.Unwrap同時(shí)fmt.Errorf也支持了%w格式化動(dòng)詞。這個(gè)事件的意義不在于它發(fā)明了“錯(cuò)誤包裝”這個(gè)概念而在于它把包裝行為標(biāo)準(zhǔn)化了大家終于有了一個(gè)共同的基礎(chǔ)協(xié)議不同庫之間返回的錯(cuò)誤可以在同一條鏈上做統(tǒng)一判斷。從那時(shí)起Wrap就不再是某個(gè)第三方庫的專利而是每個(gè)Go開發(fā)者都會(huì)遇到的日常選擇。1.3 Wrap成了編碼規(guī)范里最大分歧點(diǎn)標(biāo)準(zhǔn)庫給了“能包裝”的能力但沒有規(guī)定“該不該包裝”。于是Wrap從技術(shù)問題變成了風(fēng)格問題而且很快演變成團(tuán)隊(duì)編碼規(guī)范里最容易被Challenge的分歧點(diǎn)。有人堅(jiān)持“每層都必須Wrap”理由是出問題時(shí)日志里能看到完整的調(diào)用上下文有人堅(jiān)持“能不加就不加”理由是錯(cuò)誤鏈太長(zhǎng)以后根本沒法讀還有人夾在中間看心情包裝。其實(shí)這些爭(zhēng)論背后藏著一個(gè)更本質(zhì)的問題錯(cuò)誤包裝的信息增益原則。每次Wrap都等于給錯(cuò)誤鏈加了一層“說明文字”如果這層說明不能讓下一個(gè)看日志的人更快定位問題那它就不是上下文而是噪音。而要判斷增益是否存在得先把%w和%v的底層機(jī)制徹底搞清楚。2. %w與%v的一字之差決定了錯(cuò)誤鏈的生死2.1 一份代碼看清%w和%v的本質(zhì)差異很多剛接觸Go 1.13的開發(fā)者以為%w只是%v的“新寫法”兩者打出來的日志幾乎一模一樣于是習(xí)慣性選擇%v。這是最常見的誤解??聪旅孢@段代碼package main import ( errors fmt ) var ErrPermission errors.New(permission denied) func main() { base : ErrPermission wrapped : fmt.Errorf(open config file: %w, base) annotated : fmt.Errorf(open config file: %v, base) fmt.Println(wrapped :, wrapped) fmt.Println(annotated:, annotated) fmt.Println(errors.Is(wrapped, ErrPermission) :, errors.Is(wrapped, ErrPermission)) fmt.Println(errors.Is(annotated, ErrPermission):, errors.Is(annotated, ErrPermission)) }輸出結(jié)果會(huì)讓你意外wrapped : open config file: permission denied annotated: open config file: permission denied errors.Is(wrapped, ErrPermission) : true errors.Is(annotated, ErrPermission): false看到關(guān)鍵了嗎兩個(gè)錯(cuò)誤的展示文本完全一樣但程序化判斷能力天差地別。用%w包裝出來的錯(cuò)誤內(nèi)部實(shí)現(xiàn)了一個(gè)Unwrap() error方法標(biāo)準(zhǔn)庫可以通過這個(gè)鉤子沿著錯(cuò)誤鏈一層層往下找直到找到原始的ErrPermission而%v只是把錯(cuò)誤當(dāng)成普通數(shù)據(jù)澆進(jìn)字符串模板里鏈在那一刻就斷掉了。這就是“一字之差決定了錯(cuò)誤鏈的生死”的含義。日志里看不出區(qū)別但程序里區(qū)別極大errors.Is需要靠鏈去找哨兵錯(cuò)誤errors.As需要靠鏈去提取具體類型沒有%w這兩件事全都做不了。2.2 errors.Is、errors.As、errors.Unwrap三件套的適用邊界理解了%w之后再來梳理標(biāo)準(zhǔn)庫三件套的使用場(chǎng)景就不難了。errors.Is(err, target)沿著錯(cuò)誤鏈逐層比對(duì)判斷當(dāng)前錯(cuò)誤鏈上是否存在某個(gè)哨兵錯(cuò)誤sentinel error常見用例是判斷底層是否返回了sql.ErrNoRows、io.EOF這類可預(yù)期的錯(cuò)誤。errors.As(err, target)沿著錯(cuò)誤鏈查找第一個(gè)類型匹配的錯(cuò)誤并把目標(biāo)指針指向它。常見用例是提取出*json.SyntaxError、*net.DNSError這種結(jié)構(gòu)化錯(cuò)誤拿到內(nèi)部字段比如Offset、Op、Err做精細(xì)化處理。errors.Unwrap(err)只解開當(dāng)前這一層返回內(nèi)層錯(cuò)誤。它一般不出現(xiàn)在業(yè)務(wù)代碼里更多是給工具和調(diào)試用。三者配合的典型寫法是先errors.Is判斷語義層是否命中預(yù)期錯(cuò)誤不命中再用errors.As提取結(jié)構(gòu)信息。例如在網(wǎng)關(guān)代理里resp, err : http.Get(url) if err ! nil { var dnsErr *net.DNSError if errors.As(err, dnsErr) { // 知道是DNS解析失敗可以換個(gè)節(jié)點(diǎn)重試 return retryAnotherNode() } return err }這里如果上游沒有用%w保留*net.DNSError那errors.As永遠(yuǎn)只會(huì)返回false程序就只能對(duì)著字符串做fucking正則匹配——那感覺糟糕透頂。2.3 自定義錯(cuò)誤類型別漏掉Unwrap方法當(dāng)業(yè)務(wù)需要自定義錯(cuò)誤類型時(shí)很多人只記得實(shí)現(xiàn)Error() string方法卻忘了實(shí)現(xiàn)Unwrap() error于是自定義錯(cuò)誤永遠(yuǎn)無法向鏈條深處透?jìng)?。下面這個(gè)例子展示了正確的做法type TimeoutError struct { Op string Cause error } func (e *TimeoutError) Error() string { return fmt.Sprintf(%s: timeout: %v, e.Op, e.Cause) } // 關(guān)鍵讓這個(gè)類型可以被errors.Is/As穿透 func (e *TimeoutError) Unwrap() error { return e.Cause }有了Unwrap方法外層errors.Is(err, io.EOF)就能穿透TimeoutError去判斷內(nèi)層是不是EOFerrors.As也能從鏈上提取出*TimeoutError拿到Op字段。如果漏掉Unwrap自定義錯(cuò)誤就成了一堵墻所有內(nèi)層信息都被關(guān)死鏈從它這兒戛然而止。這里還有一個(gè)常見坑不要把Unwrap誤寫成返回自身。如果你在Unwrap()里返回e本身errors.Is會(huì)陷入無限循環(huán)直到棧溢出。標(biāo)準(zhǔn)庫判斷到“Unwrap返回了自己”時(shí)會(huì)panic但一旦錯(cuò)誤鏈特別長(zhǎng)這種bug排查起來反而更隱蔽。更安全的習(xí)慣是自定義錯(cuò)誤類型里永遠(yuǎn)只有一個(gè)cause字段專門用來保存內(nèi)部的原始錯(cuò)誤。3. 分層架構(gòu)里我堅(jiān)持Wrap的三個(gè)位置穿過機(jī)制層面落到實(shí)際工程里。我負(fù)責(zé)的項(xiàng)目基本都是經(jīng)典的repository / service / handler三層結(jié)構(gòu)經(jīng)過這幾年迭代團(tuán)隊(duì)在錯(cuò)誤處理上形成了一個(gè)共識(shí)repository層不準(zhǔn)亂Wrapservice層必須Wraphandler層做脫敏和狀態(tài)碼轉(zhuǎn)換。下面把每一層的具體規(guī)則拆開講。3.1 repository層盡量不動(dòng)保持原始錯(cuò)誤上岸repository層是離數(shù)據(jù)庫、外部API最近的地方。這里的錯(cuò)誤大多是驅(qū)動(dòng)直接返回的比如sql.ErrNoRows、context.DeadlineExceeded、io.EOF。在我的規(guī)范里repository層拿到底層錯(cuò)誤后不做任何包裝直接返回原始err。原因很簡(jiǎn)單repository是錯(cuò)誤鏈的“起點(diǎn)”信息最完整也最真實(shí)任何提前包裝都會(huì)增加后續(xù)判斷的噪音。func (r *OrderRepo) FindByID(ctx context.Context, id int64) (*Order, error) { var o Order err : r.db.QueryRowContext(ctx, SELECT id, user_id, payload FROM orders WHERE id ?, id, ).Scan(o) if err ! nil { return nil, err // 原始錯(cuò)誤原樣返回 } return o, nil }有人會(huì)質(zhì)疑這里不包一層FindByID failed日志里怎么看得出是哪一步我的回答是這個(gè)上下文不該在這里加。FindByID本身就寫在SQL語句里數(shù)據(jù)庫驅(qū)動(dòng)的錯(cuò)誤文本已經(jīng)足夠說明問題而真正需要“哪個(gè)方法做了什么”的語義上下文應(yīng)該由調(diào)用方service層來補(bǔ)充這樣錯(cuò)誤鏈才不會(huì)有多余的重復(fù)。3.2 service層業(yè)務(wù)上下文在這里統(tǒng)一補(bǔ)充service層是我唯一強(qiáng)制要求Wrap的地方。因?yàn)檫@一層是業(yè)務(wù)的語義邊界你比數(shù)據(jù)庫驅(qū)動(dòng)更清楚這個(gè)錯(cuò)誤代表什么業(yè)務(wù)意圖。比如上面那個(gè)sql.ErrNoRows在repository層就是個(gè)“掃描不到數(shù)據(jù)”的技術(shù)錯(cuò)誤但在service層它是“訂單不存在”這個(gè)業(yè)務(wù)判斷的輸入。所以service的標(biāo)準(zhǔn)寫法是func (s *OrderService) GetOrder(ctx context.Context, id int64) (*OrderDTO, error) { o, err : s.repo.FindByID(ctx, id) if err ! nil { return nil, fmt.Errorf(query order %d: %w, id, err) } // 業(yè)務(wù)組裝... return toDTO(o), nil }這里fmt.Errorf里的“query order %d”信息是新產(chǎn)生的它告訴我們這個(gè)錯(cuò)誤來自哪張訂單、哪個(gè)操作階段。用它替換掉repository層沒有的信息正好符合前文說的“信息增益原則”。而且注意我用的是%w而不是%v這樣上一層還能繼續(xù)用errors.Is判斷sql層的問題。service層的另一個(gè)職責(zé)是保持錯(cuò)誤語義的一致性。比如你想暴露一個(gè)ErrOrderNotFound給handler層判斷不要一言不合就返回一個(gè)新錯(cuò)誤而是應(yīng)該先判斷底層是不是空行再?zèng)Q定要不要轉(zhuǎn)換if errors.Is(err, sql.ErrNoRows) { return nil, fmt.Errorf(order %d: %w, id, ErrOrderNotFound) }這樣handler層只要用errors.Is(err, ErrOrderNotFound)就能做精確處理不需要和數(shù)據(jù)庫驅(qū)動(dòng)耦合。3.3 handler層脫敏和狀態(tài)碼轉(zhuǎn)換的最后一道關(guān)handler層是整個(gè)錯(cuò)誤鏈的終點(diǎn)面向HTTP響應(yīng)或RPC響應(yīng)。這里有兩個(gè)動(dòng)作一是把錯(cuò)誤轉(zhuǎn)換成用戶可讀的信息二是對(duì)外隱藏內(nèi)部細(xì)節(jié)。我通常的做法是“先記錄完整錯(cuò)誤鏈再對(duì)外返回脫敏文本”。func (h *OrderHandler) Get(w http.ResponseWriter, r *http.Request) { id : parseID(r) order, err : h.svc.GetOrder(r.Context(), id) if err ! nil { switch { case errors.Is(err, ErrOrderNotFound): http.Error(w, order not found, http.StatusNotFound) default: slog.Error(get order failed, order_id, id, err, err) http.Error(w, internal error, http.StatusInternalServerError) } return } writeJSON(w, order) }這里要注意handler里一旦把錯(cuò)誤寫進(jìn)日志就不要再把這個(gè)錯(cuò)誤返回給調(diào)用方了也不要向上傳遞否則日志會(huì)出現(xiàn)“get order failed: get order failed”的重復(fù)。錯(cuò)誤在鏈上每層只該“處理”一次要么記錄日志要么繼續(xù)向上傳遞這是我在第4節(jié)要強(qiáng)調(diào)的失控場(chǎng)景之一。4. 包裝泛濫的三重失控套娃、重復(fù)日志與細(xì)節(jié)泄露Wrap是工具不是成就。你把它當(dāng)初戀一樣親錯(cuò)誤鏈就會(huì)變成俄羅斯套娃。以下三種失控我都真實(shí)踩過每次排查都像在剝洋蔥。4.1 套娃式錯(cuò)誤鏈排查時(shí)最怕看到這種日志套娃式錯(cuò)誤鏈的典型特征是每一層都在給同一個(gè)錯(cuò)誤加前綴但這些前綴加起來不產(chǎn)生任何額外信息。比如get order failed: query order from service failed: call repo find failed: find order from db failed: sql: no rows in result set看到這種日志的第一反應(yīng)不是感謝寫代碼的人“考慮周全”而是想問他“你到底要讓我從哪里看起”錯(cuò)誤鏈長(zhǎng)度一旦超過4層中間至少有兩層屬于純儀式性Wrap。而且這種鏈條越長(zhǎng)errors.Is匹配的性能越差雖然單個(gè)錯(cuò)誤鏈沒那么夸張但架不住請(qǐng)求量大日志的可讀性也呈指數(shù)級(jí)下降。我的經(jīng)驗(yàn)是錯(cuò)誤鏈控制在3到5層之間。repository原始錯(cuò)誤是一個(gè)起點(diǎn)service一次的上下文wrap是關(guān)鍵信息handler在記錄時(shí)做一次“收口”語義補(bǔ)充。超過5層你幾乎一定能找到冗余的包裝。4.2 日志與Wrap雙重處理等于錯(cuò)誤被處理了兩次第二個(gè)失控場(chǎng)景是“既記錄又返回”。常見寫法是這樣func (s *OrderService) GetOrder(ctx context.Context, id int64) (*OrderDTO, error) { o, err : s.repo.FindByID(ctx, id) if err ! nil { slog.Error(find order failed, id, id, err, err) return nil, fmt.Errorf(query order %d: %w, id, err) } return toDTO(o), nil }repository層已經(jīng)把這個(gè)錯(cuò)誤寫進(jìn)了日志service層又記錄了一次到了handler層再記錄一次。結(jié)果就是線上排查時(shí)要看三遍同一條錯(cuò)誤Log系統(tǒng)里相同信息被檢索出來三份。社區(qū)里有一句流傳很廣的原則錯(cuò)誤應(yīng)該只被處理一次。要么你在當(dāng)前層記錄日志要么Wrap后向上傳遞但不要既記錄又傳遞更不要每層都記錄。落到實(shí)操上團(tuán)隊(duì)可以約定repository層不記錄錯(cuò)誤日志直接返回service層Wrap且不記錄handler層記錄日志但并不再向上傳遞。這樣一條錯(cuò)誤鏈上日志只會(huì)出現(xiàn)一次完整記錄干凈又精準(zhǔn)。4.3 面向用戶的錯(cuò)誤別讓內(nèi)部細(xì)節(jié)裸奔第三個(gè)失控是“把內(nèi)部細(xì)節(jié)暴露給外部”。有些項(xiàng)目為了省事在handler層直接返回err.Error()當(dāng)作API響應(yīng)數(shù)據(jù)庫驅(qū)動(dòng)的信息就順著接口漏出去了。外部調(diào)用方不僅能看到“dial tcp: lookup db.internal”這種內(nèi)網(wǎng)地址還能通過錯(cuò)誤文本猜測(cè)你的技術(shù)棧、中間件版本甚至能靠報(bào)錯(cuò)內(nèi)容做進(jìn)一步的注入試探。正確的姿勢(shì)是內(nèi)部錯(cuò)誤在service層使用%w保留完整鏈在handler層只輸出一層穩(wěn)定的錯(cuò)誤碼或通用文案。對(duì)外輸出的錯(cuò)誤信息應(yīng)該脫敏對(duì)內(nèi)保留的錯(cuò)誤鏈應(yīng)該盡量完整。這兩者并不矛盾只是作用對(duì)象不同內(nèi)部日志看的是“為什么”外部響應(yīng)看的是“下一步怎么辦”。4.4 哨兵錯(cuò)誤的隱性破壞用了%v斷的不僅是鏈最后一種失控尤其隱蔽項(xiàng)目里定義了哨兵錯(cuò)誤sentinel error后續(xù)卻用%v包裝它。前面代碼已經(jīng)驗(yàn)證過fmt.Errorf(xxx: %v, err)輸出文本沒問題但errors.Is找不到目標(biāo)了。于是業(yè)務(wù)里errors.Is(err, ErrOrderNotFound)永遠(yuǎn)返回false最終被handler當(dāng)成“internal error”返回500客戶端拿到一個(gè)沒頭沒腦的服務(wù)器錯(cuò)誤。這種問題在開發(fā)環(huán)境幾乎測(cè)不出來因?yàn)殚_發(fā)環(huán)境里大部分請(qǐng)求都成功只有到了線上流量大、分支多的時(shí)候某些異常路徑才被觸發(fā)緊接著就被幾百個(gè)“500 internal error”的告警淹沒。如果你在排查這類故障時(shí)發(fā)現(xiàn)“明明錯(cuò)誤信息里寫著order not founderrors.Is卻不命中”不用懷疑八成就是某個(gè)位置的Wrap用了%v。5. 一次訂單查詢故障errors.Is如何在三層鏈里精準(zhǔn)定位理論講多了來一段實(shí)戰(zhàn)復(fù)盤。這是發(fā)生在我負(fù)責(zé)的電商訂單服務(wù)里的真實(shí)案例雖然細(xì)節(jié)做了簡(jiǎn)化但排查鏈路完全還原。5.1 故障現(xiàn)場(chǎng)一個(gè)只留下“internal error”的告警某個(gè)周二下午訂單列表接口的告警突然響起來成功率掉到97%。當(dāng)時(shí)開發(fā)環(huán)境、測(cè)試環(huán)境全都正常只有線上偶發(fā)性失敗??锤婢罩緃andler層記錄的只有一行l(wèi)oad order list failed: internal error這不是真實(shí)的錯(cuò)誤鏈而是handler把錯(cuò)誤脫敏成了internal error輸出真正的錯(cuò)誤鏈寫在了另一個(gè)字段里。我打開日志詳情一看完整錯(cuò)誤是load order list failed: marshal order 918273 failed: json decode order row failed: unexpected end of JSON input三層鏈每一層都有信息哪張訂單918273、哪個(gè)操作marshal、從哪個(gè)環(huán)節(jié)開始出問題json decode order row。這是當(dāng)初嚴(yán)格按照“repository不包、service包一層、handler脫敏記錄”的規(guī)范留下的成果問題在于——光看文本我還是不知道哪張訂單的數(shù)據(jù)壞了。5.2 順著錯(cuò)誤鏈逐層拆解找到真正的壞環(huán)節(jié)接下來就是用errors.As提取根因類型的時(shí)候。因?yàn)樽罾飳邮莏son decode order row failed: unexpected end of JSON input我懷疑是某個(gè)訂單行的字段非法JSON導(dǎo)致json.Unmarshal解析失敗。于是我在排查用的臨時(shí)調(diào)試端點(diǎn)里加了一段代碼var syntaxErr *json.SyntaxError if errors.As(err, syntaxErr) { log.Println(json syntax error at offset:, syntaxErr.Offset) }結(jié)果還真提取出來了offset精確指向某個(gè)訂單描述字段的斷點(diǎn)。我順著這條線索找下去發(fā)現(xiàn)某個(gè)訂單的payload字段在寫入時(shí)被上游系統(tǒng)截?cái)鄬?dǎo)致JSON內(nèi)容不完整。問題定位到數(shù)據(jù)污染而不是代碼邏輯Bug。之所以能這么高效正是因?yàn)殄e(cuò)誤鏈上沒有斷點(diǎn)repository的原始錯(cuò)誤類型*json.SyntaxError經(jīng)過service和handler兩層Wrap之后仍然保留在鏈里errors.As從最外層一路穿透到最內(nèi)層準(zhǔn)確提取出了細(xì)節(jié)。如果中間任何一處用了%v所有結(jié)構(gòu)化信息都會(huì)變成純文本我就只能寫正則去匹配那個(gè)offset甚至可能被迫重新打開線上數(shù)據(jù)做全量掃描。5.3 如果當(dāng)初用了%v這次的排查會(huì)是什么體驗(yàn)假設(shè)當(dāng)初service層寫的是fmt.Errorf(marshal order %d: %v, id, err)這次事故的排查體驗(yàn)馬上變成另一番光景日志里只能看到一串文本errors.As完全失效想確認(rèn)根因是不是JSON解析錯(cuò)誤要么靠人肉讀日志猜要么把訂單詳情全量拉出來重新Unmarshal一遍驗(yàn)證。在最壞情況下線上一個(gè)偶發(fā)錯(cuò)誤能讓人排查一整天。而正確配置%w之后整個(gè)排查從“猜”變成了“查”錯(cuò)誤鏈上的每一層都有明確信息errors.Is和errors.As把結(jié)構(gòu)化判斷變成程序行為。這個(gè)體驗(yàn)差異就是Wait與Not Wait之間最直白的性價(jià)比對(duì)比。6. 六條Wrap心法寫給我的團(tuán)隊(duì)也寫給你說了這么多最后沉淀幾條我在實(shí)際項(xiàng)目中反復(fù)校驗(yàn)過的原則。它們不是什么高深理論就是寫在團(tuán)隊(duì)Wiki上的約定但確實(shí)讓錯(cuò)誤處理從“個(gè)人品味”變成了“可執(zhí)行的規(guī)范”。6.1 心法一有信息增益才Wrap每次動(dòng)手寫fmt.Errorf(xxx: %w, err)之前先問自己這句話有沒有增加任何一條“前一層不知道的信息”如果有Wrap如果只是給錯(cuò)誤換個(gè)說法停手。信息增益這個(gè)判斷標(biāo)準(zhǔn)能過濾掉八成儀式性包裝。6.2 心法二層級(jí)之間必須Wrap層級(jí)之內(nèi)少Wrap跨層傳遞錯(cuò)誤時(shí)必須Wrap因?yàn)槟悴荒軄G掉調(diào)用方向的上下文在同一層內(nèi)調(diào)用工具函數(shù)時(shí)不要每個(gè)函數(shù)都Wrap否則你會(huì)收獲一條三層起步的套娃鏈。收口原則很簡(jiǎn)單從哪一層進(jìn)了這個(gè)錯(cuò)誤就從哪一層加上第一層業(yè)務(wù)上下文中間的內(nèi)部函數(shù)保持原樣。6.3 心法三需要被程序判斷的錯(cuò)誤必須%w其余按需選擇如果一個(gè)錯(cuò)誤會(huì)被上層用errors.Is判斷比如哨兵錯(cuò)誤或用errors.As提取比如*net.DNSError必須用%w。如果這個(gè)錯(cuò)誤只是合并成日志給人看不再參與程序邏輯判斷%v其實(shí)更安全——因?yàn)槟悴幌M{(diào)用方和內(nèi)部實(shí)現(xiàn)細(xì)節(jié)產(chǎn)生耦合。6.4 心法四面向用戶的錯(cuò)誤脫敏面向日志的錯(cuò)誤保鏈對(duì)外響應(yīng)永遠(yuǎn)只暴露“用戶能采取行動(dòng)”的錯(cuò)誤對(duì)內(nèi)日志永遠(yuǎn)保留“開發(fā)者能定位根因”的完整鏈。兩者不能顛倒一旦內(nèi)部細(xì)節(jié)漏到外部接口你不只泄露了實(shí)現(xiàn)還把安全隱患交給了別人。6.5 心法五日志和Wrap二選一別兩個(gè)都做記錄日志本身是一種“處理”Wrap繼續(xù)上傳是另一種“處理”。在同一個(gè)層面既記日志又向上Wrap等于把一個(gè)錯(cuò)誤處理了兩遍日志系統(tǒng)里立刻出現(xiàn)重復(fù)信息。要么只記不傳要么只傳不記這個(gè)約定越早定下來后期排查越輕松。6.6 心法六哨兵錯(cuò)誤和自定義錯(cuò)誤類型都是對(duì)外API別輕易改一旦ErrOrderNotFound這種哨兵錯(cuò)誤被定義并廣泛使用它就成為了團(tuán)隊(duì)內(nèi)部模塊之間的契約。改動(dòng)它的文本信息通常還能忍errors.Is是按身份判斷不看字符串但改動(dòng)它的語義范圍或刪掉自定義類型里的字段會(huì)讓所有依賴方一起遭殃。任何對(duì)錯(cuò)誤API的變更都該走和接口變更一樣嚴(yán)格的評(píng)審流程。最后再分享一點(diǎn)個(gè)人感受我見過太多團(tuán)隊(duì)花大把時(shí)間爭(zhēng)論“要不要Wrap”卻沒有花十分鐘把錯(cuò)誤鏈的規(guī)范寫進(jìn)文檔。其實(shí)標(biāo)準(zhǔn)庫errors包設(shè)計(jì)得非常收斂核心就是“保留鏈、可判斷、可提取”這九個(gè)字。真正讓Go錯(cuò)誤處理難用的往往不是語言本身而是我們對(duì)“信息增益”和“層級(jí)邊界”缺乏統(tǒng)一認(rèn)識(shí)。把這兩件事想透了To Wrap or Not to Wrap就不是靈魂拷問只是一道有標(biāo)準(zhǔn)答案的工程選擇題。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩成人人妻网站| 国产综合久| 曰韩操B| 岛国不卡超碰护士AV在线播放| 久久久国产成人一区二区三区在线| 777超碰| 少妇内射视频| 97精品第3页| 丁香五月成人| 久久亚洲AV无码专区国产精品| 蜜臀99久久精品久久久久| 91精品成人| 无码色| 男人a天堂手机在线版| 日韩性爱长视频免费| 久草热制服丝袜在线观看| 丁香婷婷啪啪| 国产精品99久久久www| 伊人操你| 熟女乱3伦999| 亚洲精品日日夜夜52| 97超碰欧美| 久久午夜神马| 日韩精品一二三| 91无码人妻精品一区二区三区蜜桃 | 日本熟女不卡视频| 亚洲 一区二区 自拍| 久久狠狠色噜噜狠狠狠狠97| 深喉吞精| juliaann欧美丝袜办公室| 日韩欧美天天爽爽爽天天爽爽| 久久一二区四| 中文字幕AV中出| 国产AV超爽| 五月婷婷五月天| 亚洲无码电影久久久| 欧美91色| 欧美热图99| 久湿久久| 欧洲人妻视频| 78久久| 日韩色香| 97人人夜夜精品视频| 中文字幕人妻资源在线| 日韩免费一级性爱视频| 7777奇米影视久久| 亚洲熟女性高潮久久久| 日本性爱网址| 久色网| 五月天婷婷小说| 九月丁香婷婷| 嗯阿好爽好紧| 男人的天堂2000| 动漫av中文| 后入式在线免费观看60秒| 91天射| 日日日日做夜夜夜夜做无码97| 性爱AV天堂| 亚洲九九视频| av网站在线看| 亚洲制服aⅴ中文字幕| 亚洲av影院在线观看| 综合自拍| JULIA人妻风俗店中出电影| 欧美久久婷| 亚洲综合性网址| 少妇熟女视频一区二区三区| 五月丁香激情四射| 2018天天干在线视频| 麻豆啪啪啪视频| 日日夜夜狠狠| 欧美另类自拍 | 91美女国产在线| 97 国产精品| 久久精品国产亚洲AV清纯| 夜夜操青青草| 日韩欧美女优电影| 黑人精品欧美一区二区蜜桃| 人人操 欧美| 岛国片在线观看视频亚洲| 亚洲影视综合网| 曰韩香蕉97| 91亚洲欧洲| 精品偷拍13p欧美dodk视频| 天天干少妇| 综合激情一一91| 人人爱人人乐人人操| 97视频观看| 裸体1区| 女人综合网| 亚洲av综合色| 亭亭丁香激情| 9Ⅰ超碰| 人妻丰满熟妇一区二区三| 五月色网| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 操操操五月天婷婷丁香影院| 综合一区中亚洲国产成人综合精品| 亚洲 图片 综合91| 亚洲人久久久久日| 3p国产欧美99热| 国产精品suv一区| 午夜无遮挡男女啪啪视频| 婷婷爱五月| 午夜AV污污污| 中日韩久久久| 熟妇人妻一区二区三在线| 神马久久久久| 蜜桃久久综合视频| 久久久久久九九九九九| 少妇毛片久久| 一区二区高清视频| 91色情黑丝搞鸡在线观看一区二区三区三州| 久久超碰免费的| 白丝av| a网站免费观看| 大粗鳼巴久久久久| 精品在线78| 午夜欧美女人操逼| 日日骚av| 人人透人人操| 999久久久久久久久| 免費黃色視頻觀看一| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 久久一本大香蕉| 免费A片三p视频| 久久久久精| 欧美裸体美女日麻屄| 欧美性爱五月天| 91精品人妻一品二品三品| 欧美 亚洲 偷拍自拍| 玖玖资源视频一区二区三区| 国产区性爱在线视频秋霞豆| 国产精品禁久久久精品| 欧美日韩高潮喷水91| 九九九国产| 久久久久13| 少妇综合| 2019午夜福利视频| 日韩人妻精品久久久久| 国产一级内射高清视频| 美女黑人91神马| 婷婷五月天激情网| 欧美 亚洲精品首页| 97超碰碰碰| 日本在线观看网址| 欧美性天天影院| 黑人精品成人一区二区三区| 亚洲交性| 蜜桃狠狠色伊人亚洲综合 | 宅男影院久久久,99| 啊啊啊啊二区好大| 国产黄色av大片网站| 大香蕉中文在线| 色婷婷蜜臀av| www九九热| 国产精品女久久久久av爽| 大干人妻| 亚洲射综合网| 日韩AV无码中文一区二区| 黄色欧美性爱视频| 亚洲AV色图一区| 五月婷婷爱六月丁香色| 蜜臀99久久精品久久久懂爱| 青青草五月份天| JULIA人妻风俗店中出电影| 九九精品无码专区免费| 亚洲AV色图| 午夜呻吟欧美| 蜜乳av首页| 襙一襙| 午夜操操操| 成人无码专区精品视频| 日韩黄色成人性爱| 韩日无码在线观看| 国内精品久久人妻性色av| 中文在线视频| 99操| 亚洲不卡不卡中文字幕不卡| 另类图片天天影视| 青草视频人妻在线观看| 欧美的精品的视频| 乳欲人妻办公室奶水| 欧美九一精品久久久熟妇| 国产精品久久| 精品少妇一区二区三区| 欧美中文狠| 亚州伊人色综台| 久久久久久电影| 欧美日韩在线视频网站| 久久老熟女| 亚洲无限观看| 丝袜美女诱惑 91 视频| 久久久久久久久久久久黄色 | 懂色av色欲av蜜臀av| 欧美激情高清性猛交| 亚热日本熟女| 久草男人天堂| 91国精产品| 神马午夜久久久| 欧美美女啪啪视频| 日本熟妇熟色97一本在线观看| 久久久中文| 成人午夜视频免费播放| 久久精品国产亚洲AV片多多| 91精品久久久久五月天精品| 国产精品无码成人精品| 国产无码精品成人| AV乱伦专区| 久久精品人人做人人看| 秋霞一级鲁丝片A片| 热99这里有精品综合久久| 五月天AV资源| 伊人9| 天天看片麻豆| 91AV天美在线视频| 国产91美女视频| 欧美丝袜中文字幕07在线| 激情内射| 东北熟女91| 91老司机在线| 日本孕妇一区二区视频操逼免费看 | 日韩在线观看三级电影| 极品销魂美女一区二区| 欧美顶级黄色大片免费| 狠狠综合网| 久久xx| 亚洲老熟妇xxx| 尹人大香蕉视频在线| 校园春色 男人天堂 | 国产无码久久高清| 1人人看人人摸人人操| 在线看的av| 国产51色综合久久免费| 伊人婷婷五月天| 99热这里| 东京热av男人的天堂| 啊啊啊啊啊啊啊在线| 久久风骚城市| 欧美成人亚洲精品| 精品综合久久久久久五月天| 亚洲成人在线乱码色午夜| 一卡二卡在线播放| 欧美人体性爱互联网第一页婷婷日本| 久久亚洲欧美中文字幕国语| 操九九九九九九| 一区 欧美 日韩 麻豆| 青青草日韩免费观看高清在线| 夜夜春夜夜操| 麻豆国产97在线| 亚洲国产午夜真人一级片中文字幕精品黄网站 | WWW美腿丝袜香蕉中文| 欧美激情视频一区二区| 欧美性生活免费网| 无码又爽又硬又激情免费视频| 国产青视频| 中文字幕av片| 蜜乳AV一区| 免费观看有码高清视频| 亚洲欧洲无码一区夜| 人人妻人人澡人人爽久久av| 看一级特黄a大一片| 国产欧美第五页| 91日产欧美| 唯美清纯 妖精视频| 中文色综合| 99热网站| 成人日韩3| n1038 一二三区| 夜夜黄| 久久性爱视频99| 超碰在线第一页| 亚洲人天堂| 91伊人久久在线| 97精品免费| 日本三级日本三级99| 天天综合影院91| 友优传媒精品在线一区二区| 99性爱视频| 97超级色碰碰| 国产精品麻豆视频网站| 四虎国产成人精品免费一女五男| 夜夜欧美| 日韩有码一区三区| 亚洲小说视频| 爱爱60秒免费视频| 国产三级片在线观看| 免费观看啪视频| 2021国产成人精品久久| 激情文学网伊人| 国产区在线| 亚洲福利中文字幕在线| 亚州欧美另类| 伊人影院中文字幕| 日韩亚洲欧美中文字幕| 在线啊啊啊啊| A 天堂| 国产九九久久久精品| 欧美翘臀视频网站一区二区三区| 深爱五月婷婷| 思思热在线视频在线| 97精品国产97久久久| 视频不卡中文字幕| 国产九九久久久精品| 97在线免费观看| 青青草视频爽一爽| 超碰色男人操熟女| 97精品国产精品免费观看| 中文字幕奈奈美被公侵犯| 青青草白白色| 强奸乱伦Av网| 亚洲成人贴图| 天天爽夜夜欢视| 91搞逼视频| 国产白丝在线| 国产尹人在线视频免费| 成人性交午夜免费片| 你操综合| JIZZJIZZ国产精品喷水| 国产精品久久久久久久久久久久久久吹| 性爱视频久久| 激情网色| 97干97色| 精品无码久久久久| 激情小说五月天| 久久精品国产Aⅴ| 韩日巨乳美女免费视频在线观看| 99视频只有精品| 国产中出内射一区二区| 国产九九九九九九| 久久久工口| 国产黄色 A 片免费看| 91痴汉| 亚洲伊人久久精品狠狠在线| 噜噜噜无码AV一级一级久久影院| 操逼操2| 色综合久久夜色精品国产天堂| 青娱乐日韩无码| 日本不卡五区| 午夜精品人妻二区三区| 粘花网06av视频| 久久一区二区三区入口| 欧美一区二区一级岛国大片| 亚洲骚逼少妇| 超碰98综合网| 亚洲精品色| 日韩人妻一区二区精品| 色婷婷成人综合| 欧美性爱精品一区二区| 大香蕉视频一二三区| 国产嫩草精品A88AV| 亚洲熟妇丝袜在线观看| 性爱综合网| 亚洲第一精品在线视频| 17c在线成人免费A片观看| 男人的天堂免费| 伊人亚洲综合| 日韩精品熟妇| 日韩人妻少妇中文字幕| 国产热RE99久久6国产精品首| 欧洲性爱无码区| 欧美加勒比| 欧美小说区视频区| 加勒比综合a∨| 色五月69夫妻| 97资源超碰| 2024人人操人人摸| 婷婷AV一区二区三区| 国产日韩区| 2020中文字幕在线| 青青草色情网站视频| 色色亚洲| 婷婷亚洲天堂| 超碰碰碰碰| 国产无马av| 久久久 国产精品| 国产自产自拍| 久久久久久亚洲中文| 免费观看日本操逼视频| 欧美综合天天| 国产精品久久久吖| 国产午夜福利专区综合| 国产高清视频无码在线| 370p日韩欧美亚洲精品| 顶级丝袜熟女一区二区三区| 粉嫩av在线一区二区| 久久五月天婷婷丁香中文字幕| 亚洲精品国语在线播放| 国产精品福利视频播放| 国产黄色影片在线观看| 新婚人妻扶着粗大强行坐下| 国产精品亚洲一区二区三区四区| 国产成人无码网站在线视频| 97久久视频| 五月婷婷丁香六月| 欧美专区第一页| 亚洲 中文 女同| 色九九九| 色哟哟av网址| 美欧色综合| 超碰在线人人射| 日韩免费在线观看不卡| 久久五十路熟女人妻| 中文字幕一区二区韩| 天天干人妇| 婷婷丁香六月天| 亚洲一二三精品久久网| 精品一国2| aV中文麻| 强被迫伦姧在线观看无码网站| 大香蕉视频一二三区| 思思热久久成人| 伊人五月天| 国产精品小视频一区二区三区| 色综合加勒比四四季| 水多多映视AV| 久久精品日韩| 乱精品一区字幕二区| 岛国AV一区二区电影| 亚洲综合骚逼| 久久久久久久唑| 少妇厨房愉情理伦片bd在线观看| 久久久久国产无av| 91视频观看网站| 亚洲诱惑天堂| 久久永久无码人妻视频| 在线强奷到舒服的无码视频| 丰满人妻一区二区三区在线| 蜜臀av网址| 日韩免费a级毛片无码a∨| 手机在线中文字幕国产| 大稥蕉免费视频这里只有精品| 精品网站99999| 精产品久久| 精品人妻av在线播放| 日韩一区二区精品视频| 国产精品3| 色视频蜜乳| 丁香五月色情| 超碰一区二区| 国产一级高跟丝袜| 欧美天天谢综合网| 少妇一区二区三区| 国产精品99久久久www| 欧美日韩婷婷中文| 日本操逼视频免费| 99婷婷| 少妇丝袜在线观看AV| 在线日韩日本亚洲国产| 日本三级韩三级99久久| 997色在线| 国产美女口爆吞精视频| 成人夜夜爽| 欧美日韩不卡传媒| 高清无码 国产精品| 另类图片五月| 插入综合网| 久久精品免费| 丝袜六区| 欧美狠狠操| 色综合91好| 伊人五月天| 中字一区| 九九黄色视频在线观看| 亚洲性感丝袜诱惑在线观看| 青娱乐国产盛宴视频| 久久久久七视频| a片久久久久久久久久久久 | 97免费在线观看视频| 色婷网| 九九人妻| 性色av婷婷久久一区二区点复制| 99re在线视频这里只有精品| 中国东北熟女老太婆内谢| 久久伦理视频久久大香蕉视频| 激情抓乳插进去啪啪啪日韩| 亚洲无限观看| 欧美日韩国产色图在线| 97资源站国产精品| 欧美在线官网| 亚洲一区日韩精品中文字幕| 欧美日韩少妇色情| 人人插人人摸人人| 亚洲美腿丝袜香蕉影视欧美成人| 亚洲性图91| 久操网视频| 欧美丝袜激情| 伊人综合色网| 亚洲精品97| 天操天操夜操夜月操月年年操 | 91久久久久久| 精品国产一区探花在线观看| 97天天综合网| 日va操| 97操97干| 色噜噜国产在线| 6080YYY午夜理论片在线观看| 美女诱惑在线一区| 亚洲福利中文字幕在线| 男人的午夜天堂| www.高清无码诱惑一区.com | 欧美日韩97在线| 视频分类 国内精品| 91熟女网| 日韩精品作爱导航| 在线只有精品| 99re热有精品视频国产| 亚洲天堂少妇| 久久一留热品黄| 综合操逼| 青娱乐休闲视频在线观看| 老师充足的奶水小说| 日本国产欧美高清在线| 亲子敌伦对白在线播放| 中文无线日韩一区| 日韩人体偷拍| 粉嫩av在线一区二区| 精品九九九九九| 亚洲诱惑天堂| 乱码熟妇人妻久久久| 婷婷91| 手机在线中文字幕国产| 78久久| 天天情欲宗合网| 久久国产精品一级二级三级| 人妻-91porn| 老司机深夜18禁污污网站| 日韩精品人妻中文字幕不卡乱码| 大香蕉99热| 婷婷午夜| 免费av大片| 91啦人妻| 黄片www视频免费| 日本幼女18+| 99re在线视频国产| 绯色AV粉色AV蜜臀AV| 久久XX| 国产 无码 一区二区| 日本孕妇一区二区视频操逼免费看 | 欧美日韩人人精品| 亚洲天堂,男人| 日本三级R| 日韩一性一交一A片俄罗斯| 日韩av在线精品观看| 97chaopengongkai| 老熟乱一区二区三区四区| 人人操人人色网| 国语精品av| 伊人在线大香蕉视频久久| 青青欧洲黑| 美女91在线观看| 久久9久9久99久9久9| 91 刺激在线| 五月天综合| 色婷视频| 中文字幕黑人大片| 亚洲中文字幕97久久精品少妇| 亚洲综合色婷婷| 国产欧美一区激情交| 国产精品香蕉热久久新品| 很黄很色的视频在线观看| 天天躁日日躁AAAAXXXX国产 | 欧美综合骚| 五月丁香综合激情| 婷婷四五区| 中文字暮97| 欧美最婬乱婬爆婬性视频 | 99精品无码| 亚洲人成网www| 韩国毛片一区二区三区| 日韩激情毛片一级久久久| 欧美天天插| 国产区在线| 久操热线| 日韩精品 欧美激情| 日本在线视频导航| 亚洲激情深爱文学小说网站| 一区二区三区免费岛国片| 校园春色中文字幕AV| 99e久久国产精品| 天天色综合图片| 亚洲久久久| 67914亚洲精品| 国产97亚洲| 91人妻超碰| 国产精品人妻无码久久久老鸭窝 | 成人一级性爱| 91 丝袜在线观看| 日本操嫩b网| 国内外毛片在线观看| 黄片不用下载在线观看| 婷婷激情丁香| 96久久科窝| 亚洲一区操| 91欧美丨精品丨入口| 亚洲成人日韩小说| 欧亚韩国999| 99热免费| 波多野结衣AV无码一区| 操死我了嗯嗯嗯| 一级A片女人高潮叫床| 亚洲综合色图欧美| 欧美熟妇乱码在线一区| 十八禁av无码免费网站APP| 久九9精品| 91精品久久久久久77777| 夜夜嗨一区二区三区直播内容| 欧洲色色| 无码人妻精品一区二区中文| 日本熟妇自慰性高潮一区二区三区| www.婷婷| 久久精品国产亚洲妲己影视| 精品无码产区一区二| 思思热在线观看| 美日韩男女操屄视频| 久久视频少妇美女| 日本在线一二 | 激情干在线| 97亚洲在线| se,,,亚洲欧美| 九九久久99| 最新av网站在线观看| 九九九九精品在线| 婷婷五月天久久精品视频一区二区三区 | 国产免费久久精品99re韩国| 日韩av乱伦| 久久精品国产AV一区二区三区| 人人操超碰在线| 97玖玖超碰| 婷婷综合| 国产成人免费观看在线视频| 亚洲 暴爽 AV人人爽日日碰| 啊啊啊啊啊舒服| 97网址www| 亚洲天堂 视频你懂的| 女性喷水高潮在线观看| 丰满熟妇大乳做爰| 欧洲与亚洲欧美精品中文字幕| av九九| 伊人久久综合精品欧美| 女人精品内射国产99| 超碰在线在公开超碰在线在公开| 欧美性,色九九| 五月婷婷六月天| 欧美日韩国内不卡| 久久久亚洲Av| a级免费在线观看| 天堂网亚洲区手机版| 夜夜 中文视频rt| 国产午夜福利视频在线| 欧美色偷拍| 色婷婷久久| 亚洲AV无码国产精品久久久久| 亚洲无无码αⅴ每日更新| 校园春色五月天| 日曰骚久久精品| 曰本道人妻久久久在线不卡色视频| 99综合自拍| 人妻精品综合中文字幕在线 | 亚洲AV不卡在线观看尤物| av天天在线观看| 色婷婷综合网站| 中文自拍欧美影视| 偷拍自拍在线视频观看| 日本99一区二区| 在线观看av区| 91日韩网站| 人妻乱仑一区二区三区| 国产特级毛片AAAAAA高潮流水 | 亚洲天堂一区| 色与欲影视| 国产日本顶级一区二区三区| 999久久久久久久久| 国偷自 一区二区| 曰韩香蕉97| 日本熟妇色熟妇在线视频播放| 国产极品久久久| 操人妻逼91| 亚洲 欧美 小说| 久久精品视频28| 午夜天堂精品久久| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 3PAV乱伦视频| 丝袜人妻av一区二区| 国产强奸乱伦无码视频| 国产精品内射婷婷一级二| 99久久国产精品免费高潮| 黄色无码高清黄色无码网站| 国产在线综合福利网站| 久久亚洲中文字幕视频| 黄视频免费| 国产高清26uuu| 中国一区二区亚洲人妻| 综合色图区| 夜夜爽77777| 97色插| 丝袜综合| 蜜桃视频啊啊啊啊| 96超碰网| 家庭乱伦麻豆| 亚洲h片在线免费观看| 国产无马视频| 玖玖婷婷五月天| 日韩美一区| 啊啊啊好舒服好爽啊啊啊视频| 欧美国产一区二区三区麻豆传媒| 九九综合网| 狠狠入| 1769一区| 国产极品一区二区三区三州| 日产狠狠干| 91美乳| 欧美特黄视频网站| 极品色| 精品偷拍13p欧美dodk视频| 欧美极度丰满熟妇hd| 97精品国产97久久久久久| 欧美日本天堂| 国产精品成人午夜福利| 摸奶性爱视频网站在线免费播放| 中文一区在线视频| 狠狠中文字幕| 日日嗨AV一区二区夜夜| 欧美日韩资源| 青娱乐国产精品| 综合色图亚洲欧美| 久湿久久| 看日韩黄片| 91干熟女| 亚洲 欧美 另类 日韩 人妻一区| 亚洲资源吧| www.久久制服糖| 五月天婷婷综合网| 亚洲色图综合网| 青娱乐休闲视频在线观看| 黄色小视频日本txt| 男女打扑克高清网站| 精品少妇人妻一区二区三区| 日韩av性爱在线播放| 国产伦精品一区二区三区在线观| 中文字幕加勒比海高清无码免费视频 | 99精品在线观看| 国产精品久久久久久久久久久久久久久久 | 亚洲性刺激| 久久青青草原免费视频| 五月天黄色av| 91老司机精品| 日韩成人精品视频自拍| 久久99手机免费视频| 99re超碰| 99热66| 中文字幕精品亚洲熟女| 高清无码在线播放网站| 久久精品免费| 99re在线| 好吊妞转入那个网| 97超碰伊人| 99久久久er直播网址| 上床不卡网站| 久久久久亚洲熟妇熟女| 欧亚综合一卡二卡中文字幕| 清纯唯美亚洲另类| 黄aaaaaaaaaaaaaaaaaa色网站| 中文字幕综合人妻| 成人自拍三级在线观看| 日韩一999精品| 啊啊啊好多水| 96精品在线| 九热久| 激情综合五月| 久久精品久久久久久久| 五月色综合| JuliaAnnXXX888| 色综合久久888| 亚洲丝袜在线观看| 99精品久久| 国产免费内射视频| 婷婷五月在线视频| 男人的天堂2018| 色蜜AV| 97操| 久草资源在线视频官方总站日韩丝袜美腿| 在线日韩精品一区二区三区| 91n美女视频| 麻豆国产97在线| 97久久精品亚洲中六字幕| 国产美女销魂在线观看不卡| 91欧美美女日韩国产婷婷| 欧美激情性久久久久久| 日韩电影天堂视频二区三区| 一线黄色免费性爱片| 中国熟女91| 国产无马av| 97在线看| 九九拍拍精品视频在线播放| 伊人久久大香线蕉无码| 男人天堂无码| 丝袜美腿欧美| 国产精品嫩草影院午夜两性| 大香蕉综合在线| 亚洲欧美精品福利在线| juliaann丝袜| 男人干美女| 欧美专区日本专区| 亚洲久9| 9热9热综合网| 91强奸乱轮| 欧美综合网在线| 91日日| 一区二区三区激情在线观看| 熟妇视频一区二区三区在线| 黑丝91视频| 国产欧美一级在线观看| 九九九九九九九九九国产精品| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 色婷婷六月| 26uuu国产亚洲综合| 91亚洲欧美综合高清在线| 亚洲色五月| 天天躁日日躁AAAAXXXX国产| 天堂av最新电影网| 欧美熟妇乱码在线一区| 亚洲中文日韩欧美大香蕉视频| 99热婷婷一区二区三| 久久久久久91香蕉国产| 亚洲日本韩国在线| 亚洲一卡二卡在线免费| 人人操人人精品影片| 国产日韩精品一区二区三区| 懂色AV蜜臀无码精品APP| 九九九九9999| 9997se| 亚洲欧美九九九| 91色婷婷综合久久中文字幕二区| 亚洲一区日韩精品中文字幕| 97国产精选| 亚洲少妇激情视频| 人妻激情偷乱视频一区二区三区 | 日本爽爽爽爽爽爽免费视频| 色哟哟av| 日韩精品三级片长长久久| 日韩在线76| 久久久精品无码亚免费| 国产毛片毛片4p懂色| 天天欧美97| 色综合99999| 99re这里只有精品3| 91粉嫩萝控精品福利网站_精品影音先锋国 | 国语少妇精| 少妇久久久免费| 国产AV天美| 久久黄色网址| 五月天开心网| 欧亚在线视频| 国产大学生口爆吞精合集| 亚欧色图在线激情| 日日躁夜夜躁狠狠躁超爽| 青青操视频在线| 亚洲自拍另类丝袜综合| 亚洲影视综合网| 丁香五月婷婷色| 成人三级片无码| 国产精品无码久久久久2028| 12一15性XXXX粉嫩国产| 91网站18禁| 欧美的精品的视频| 国产9熟妇视频网站| 物业黑人 AV一区| 我中文字幕6区| 欧美色一二三| 国产91精品久久久久久久网曝门| 久久日韩毛| 午夜精品一区二区三区三上悠亚| 91一起操| 五月丁香婷婷色| 国产无马av| 色五月首页| 婷婷五月天AV| 97色婷| 九九热视频在线观看| 国产精品成人无码av| 国产成人久久久精品免费AV| 国产粉嫩出水在线播放| 国产福利影视| 天天爽人人综合免费7799| 999岛国大片| 91九色首页| 99热成人| 久久久工口| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 操人妻逼91| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 日韩三级网址| 97色视频在线| 欧美日韩亚洲电影| 色香网| 欧美色网络| 屁股久久久久久久| 国产欧美日本亚洲精品| 成人av影院在线观看| 欧美性爱中文字幕无线码| 亚洲九月丁香| 天天射影院| 黑丝91视频| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 校园春色综合网| 一级性爱视频免费观看| 人妻 丝袜美腿 中文字幕| 深夜激情无码| 一道本久久棕合爱| 欧美97日韩| 色五月AV在线| 久久综合97| 成人小说另类在线| 欧美精品xxxwww| 69精品人人人人| 亚洲色图20p| 久久噜| 97伊人网| 狠狠中文字幕| 日韩无码成人电影| 天堂日本亚洲欧美| 精人妻无码一区二区三区伊人直播 | 亚洲av热热色| 九九人妻| 国产午夜精品在线观看| 日韩精品1区2区中文字幕| 五月天婷婷小说| 99xav| 国产精品97视频| 夜夜操美女| a在线观看| 欧美一二在线| 麻豆天天躁天天揉揉AV| 成全动漫视频观看免费下载| 国产1769在线| 少妇天堂网络| 亚洲成人在线乱码色午夜| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | A 天堂| 性色av婷婷久久一区二区点复制| 欧美熟妇乱码在线一区| 性欧美| 亚洲色图尤物视频| 五月婷丁香| 久久九操在线观看| 成人免费性爱视视| av资源在线观看少妇| 欧美老妇女内射网址| 熟女91网站| 蜜乳AV网址| 国模不卡一本二本三电影| 一本色道久久综合精品婷婷| 26uuu性| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 亚热日本熟女| 久操91视频| 免费观看的av| 亚洲图片偷拍欧美| 99在线免费公开视频| 91狠婷| 不卡视频一区蜜桃视频 | 女人爽到高潮潮喷18禁网站| 热久日综合| A级片日韩欧美国产欧美视频精选观看| 日本欧美国内在线| 伊人久久亚洲色欲综合网站 | 97se亚洲| 国产三级日产三级韩国三级| 午夜精品久久久久久久99热影院| 啊啊啊想要| 超碰99在线| 亚洲校园激情| 国产偷拍自拍在线视频| 女生自91网站| 一个人免费视频观看在线WWW| 91粉芽高清在线一区二区| 青青草在线视频播放器| 亚洲精品aa久久伊人| 乱子伦一区二区三区国产精品| 国产91会所女技师在线观看| 天天操女人| 综合另类| 中文字幕一区二区三区蜜臀| 风月影院十八禁| 夜夜嗨AV一区天天| 日韩一卡二卡三卡| 97操碰| 久久国产精品m码| 五月综合视频| 黄页av| 国产最新AV| 久久男人天堂| 爆乳免费黄网站| 一中国女人毛片水真多| 欧美一级欧美三级在线观看| 东京热一区二区中文字幕| 中文高清一区二区的| 性猛交| 欧美一区二区情色| 无码免费在线观看黄色片| 躁躁日曰躁2020| 一本大道不卡一二三区| 色香在线| 永久免费发布性爱网| 99热国产精品| 久久五月天婷婷| 酒色综合网| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 天天干18禁| 精品久久久av| 免费看片黄| 中文一区在线日| 国产亚洲禁久一区二区| 国产丝袜啪啪| 四虎永久在线精品免费网址 | 久久久亚洲熟妇熟女| 色女综合| 熟女精品va中文字幕| 玖色av| 超AV色女| 操逼免费视频无码国产| 久久性爱精品一区| 狠狠干2020| 欧美色图91p| 最新av在线| 九七人妻在线| 婷婷九月国产| 日本不卡一区二区三区| 超碰欧美97资源| 欧美 色 亚洲| 好爽免费视频| 97欧美色综合| 人妻91少妇| 日本精品88888888| 搡老人老9丨女老熟人| 老熟女综合网| 中文字幕片| 久久久精品视频免费观看| 少妇蹲下露出大唇5| 成人综合视频久久| 999国产精品999| 国产在线综合福利网站| 国产视频小说| 欧美午夜精品久久久久久超碰| 一区操逼| 精品97久久| 最新精品久久蜜桃| 国产欧美亚洲精品a第2页| 超碰在线人人射| 99最新日韩偷拍视频| 久久国产精品91| 午夜福利免费精品视频| 亚洲精品97| 青青草导航在线视频| 欧美日韩人人精品| 国产成人自拍视频在线| 日本性爱视频一级| 欧美操逼录像国产黄色国产| 97国产天堂岛| 2020视频1区2区3区| 最新日产中文在线麻豆| 欧美精品69性爱| 夜夜夜爽www精品视频| 加勒比海成人视频网| 98一区二区精品| www.色操逼| 亚洲三区视频| 丰满人妻区一区二区三| 久久久成人免费av电影| 亚洲欧洲无码97久久精品| 日本久久网| 午夜欧美女人操逼| 日韩乱伦AⅤ| 成人国产视频在线观看| 91女色| 国产99999久久精品| 日韩av色图综合| 97二区四区| 婷婷月色| 超碰在线91| 欧美成人黄网色网站| 久久亚洲欧美中文字幕国语| 天天干人人看综合| 97亚洲色图| 男人的天堂三级| 蜜臀th| 欧美日韩人妻婷婷一区| 99青青草国产视频| 国产精品小视频一区二区三区| 中文字幕在线免费观看视频| 精品毛片久久久精品毛片| 福利操逼| 在线观看高清AV| 可以免费看黄片的视频| 日韩性爱小视频| 啊啊啊操死我| 熟女人妻一区二区三区| 蜜臀网 一区| 亚洲高清欧美总合| 600国产精品视频| 欧美激情在线观看视频| 偷偷人人精品女女久久| 9久9久9久9久视频网站| 91在线丝袜| 97超碰伊人| 97色欧洲| 亚州欧美在线| 98超碰欧美| 91n欧美| 久久91| 老司机福利青青草| 黄色免费网| 中文字幕日韩电影人妻| 中文字幕日韩专区精品系列| 一级二级三级黑人无码| 日韩无码操逼片| 26uuu性| 黄片免费看黄片免费看| 日本日皮视频逼| 久久五月视频| 9久超碰| 情色五月天久久久| 欧美国产一区二区三区麻豆传媒 | 操逼www.| 牛牛aV| 五月天色综合| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 日本狂喷奶水在线播放212| 色区久久| 992视频一区| 亚洲综合首页| 熟女激情综合网| 色色色色日本| 在线看免费无码AV天堂的| 五月天色色色| 亚洲中文字幕乱码无码一区二区 | 欧美日不卡| 久久精品一区| 亚洲涩图欧美| 国产精品久久久久婷婷二区次| 亚洲日韩人妻中文字幕一区| 欧美性爱第一区| 丁香九月激情啪| 少妇免费视频| 天天操天天谢| 蜜臀AV午夜精品久| 欧美的性爱网站免费| 欧美日韩国产色图在线| 超碰亚洲97| 欧美青青视频| 精品人妻丰满熟妇一区二区三| 国产免费黄色一级大片| 亚洲第2页| 欧美久久九九| 日本孕妇孕交| 日本综合色图| 欧美日韩 强奸乱伦| 精品久久久九九九孕妇| 日产123区精品免费观看|