欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

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

每年Go社區(qū)的“錯(cuò)誤處理大戰(zhàn)”一開打吵到最后的焦點(diǎn)幾乎都落在同一個(gè)問(wèn)題上到底要不要Wrap錯(cuò)誤就拿我的團(tuán)隊(duì)來(lái)說(shuō)代碼評(píng)審上最常見(jiàn)的一條評(píng)論就是“這里為什么沒(méi)加%w”而回復(fù)也高度統(tǒng)一“加了怕鏈太長(zhǎng)不加又怕斷鏈?!边@種擰巴其實(shí)很正?!狦o的錯(cuò)誤處理設(shè)計(jì)哲學(xué)與真實(shí)業(yè)務(wù)系統(tǒng)之間隔著太厚的膠水層語(yǔ)言本身只給了你一個(gè)極簡(jiǎn)接口type error interface { Error() string }可一條錯(cuò)誤從數(shù)據(jù)庫(kù)底層一路被拋出API網(wǎng)關(guān)中間還要穿過(guò)repository、service、handler好幾個(gè)層次每一層都得做一次莎士比亞式的選擇題To Wrap or Not to Wrap。這篇文章不打算站隊(duì)說(shuō)“必須全部Wrap”或者“最好別Wrap”我想結(jié)合這些年寫Go的實(shí)際感受把%w、errors.Is、errors.As這些工具到底解決了什么問(wèn)題、什么時(shí)候加Wrap是真的有信息增益、什么時(shí)候純屬自嗨式包裝講清楚。如果你正在為團(tuán)隊(duì)的錯(cuò)誤處理規(guī)范頭疼或者剛被代碼評(píng)審問(wèn)住“這里為什么不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拋出來(lái)你根本不知道它會(huì)飛到哪里中間可能被某個(gè)catch吞掉也可能一直穿到最外層。Go設(shè)計(jì)者從一開始就不喜歡這種“隱秘的控制流跳轉(zhuǎn)”他們寧愿讓你在代碼里看到滿屏的if err ! nil也不愿意讓你在log里看到一句干巴巴的Unexpected error然后對(duì)著堆棧猜是誰(shuí)吞了異常。說(shuō)白了Go對(duì)錯(cuò)誤的處理方式繼承自C的經(jīng)驗(yàn)錯(cuò)誤就是值它和正常數(shù)據(jù)一樣得顯式傳遞誰(shuí)要用誰(shuí)就得接著。函數(shù)簽名(T, error)的約定把“可能失敗”這件事寫在了類型系統(tǒng)里。很多剛轉(zhuǎn)Go的人覺(jué)得這規(guī)矩?zé)┤说矣^察下來(lái)真正讓團(tuán)隊(duì)崩潰的從來(lái)不是if err ! nil多寫了幾行而是錯(cuò)誤出來(lái)之后怎么流轉(zhuǎn)、怎么保留上下文、怎么讓上游能感知到錯(cuò)誤的“身份”。這才是每年社區(qū)爭(zhēng)論真正的火藥桶。1.2 Go 1.13把“包裝”扶正了在Go 1.13之前想給錯(cuò)誤附加上下文幾乎全靠字符串拼接fmt.Errorf(xxx: err.Error())。問(wèn)題是拼完之后原始錯(cuò)誤的所有類型信息全部丟失。你不能對(duì)一個(gè)拼好的字符串調(diào)用errors.Is也不能從一串文本里掏出當(dāng)初那個(gè)*os.PathError或者sql.ErrNoRows。社區(qū)因?yàn)槭懿涣诉@個(gè)所以出現(xiàn)了github.com/pkg/errors這類庫(kù)用WithStack、Wrap的方式把堆棧和錯(cuò)誤綁在一起但問(wèn)題在于每個(gè)庫(kù)的約定不同A庫(kù)返回的錯(cuò)誤到了B庫(kù)沒(méi)法統(tǒng)一處理。2019年Go 1.13正式發(fā)布標(biāo)準(zhǔn)庫(kù)加入了errors.Is、errors.As、errors.Unwrap同時(shí)fmt.Errorf也支持了%w格式化動(dòng)詞。這個(gè)事件的意義不在于它發(fā)明了“錯(cuò)誤包裝”這個(gè)概念而在于它把包裝行為標(biāo)準(zhǔn)化了大家終于有了一個(gè)共同的基礎(chǔ)協(xié)議不同庫(kù)之間返回的錯(cuò)誤可以在同一條鏈上做統(tǒng)一判斷。從那時(shí)起Wrap就不再是某個(gè)第三方庫(kù)的專利而是每個(gè)Go開發(fā)者都會(huì)遇到的日常選擇。1.3 Wrap成了編碼規(guī)范里最大分歧點(diǎn)標(biāo)準(zhǔn)庫(kù)給了“能包裝”的能力但沒(méi)有規(guī)定“該不該包裝”。于是Wrap從技術(shù)問(wèn)題變成了風(fēng)格問(wèn)題而且很快演變成團(tuán)隊(duì)編碼規(guī)范里最容易被Challenge的分歧點(diǎn)。有人堅(jiān)持“每層都必須Wrap”理由是出問(wèn)題時(shí)日志里能看到完整的調(diào)用上下文有人堅(jiān)持“能不加就不加”理由是錯(cuò)誤鏈太長(zhǎng)以后根本沒(méi)法讀還有人夾在中間看心情包裝。其實(shí)這些爭(zhēng)論背后藏著一個(gè)更本質(zhì)的問(wèn)題錯(cuò)誤包裝的信息增益原則。每次Wrap都等于給錯(cuò)誤鏈加了一層“說(shuō)明文字”如果這層說(shuō)明不能讓下一個(gè)看日志的人更快定位問(wèn)題那它就不是上下文而是噪音。而要判斷增益是否存在得先把%w和%v的底層機(jī)制徹底搞清楚。2. %w與%v的一字之差決定了錯(cuò)誤鏈的生死2.1 一份代碼看清%w和%v的本質(zhì)差異很多剛接觸Go 1.13的開發(fā)者以為%w只是%v的“新寫法”兩者打出來(lái)的日志幾乎一模一樣于是習(xí)慣性選擇%v。這是最常見(jiàn)的誤解??聪旅孢@段代碼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包裝出來(lái)的錯(cuò)誤內(nèi)部實(shí)現(xiàn)了一個(gè)Unwrap() error方法標(biāo)準(zhǔn)庫(kù)可以通過(guò)這個(gè)鉤子沿著錯(cuò)誤鏈一層層往下找直到找到原始的ErrPermission而%v只是把錯(cuò)誤當(dāng)成普通數(shù)據(jù)澆進(jìn)字符串模板里鏈在那一刻就斷掉了。這就是“一字之差決定了錯(cuò)誤鏈的生死”的含義。日志里看不出區(qū)別但程序里區(qū)別極大errors.Is需要靠鏈去找哨兵錯(cuò)誤errors.As需要靠鏈去提取具體類型沒(méi)有%w這兩件事全都做不了。2.2 errors.Is、errors.As、errors.Unwrap三件套的適用邊界理解了%w之后再來(lái)梳理標(biāo)準(zhǔn)庫(kù)三件套的使用場(chǎng)景就不難了。errors.Is(err, target)沿著錯(cuò)誤鏈逐層比對(duì)判斷當(dāng)前錯(cuò)誤鏈上是否存在某個(gè)哨兵錯(cuò)誤sentinel error常見(jiàn)用例是判斷底層是否返回了sql.ErrNoRows、io.EOF這類可預(yù)期的錯(cuò)誤。errors.As(err, target)沿著錯(cuò)誤鏈查找第一個(gè)類型匹配的錯(cuò)誤并把目標(biāo)指針指向它。常見(jiàn)用例是提取出*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ǔ)義層是否命中預(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 }這里如果上游沒(méi)有用%w保留*net.DNSError那errors.As永遠(yuǎn)只會(huì)返回false程序就只能對(duì)著字符串做fucking正則匹配——那感覺(jué)糟糕透頂。2.3 自定義錯(cuò)誤類型別漏掉Unwrap方法當(dāng)業(yè)務(wù)需要自定義錯(cuò)誤類型時(shí)很多人只記得實(shí)現(xiàn)Error() string方法卻忘了實(shí)現(xiàn)Unwrap() error于是自定義錯(cuò)誤永遠(yuǎn)無(wú)法向鏈條深處透?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è)常見(jiàn)坑不要把Unwrap誤寫成返回自身。如果你在Unwrap()里返回e本身errors.Is會(huì)陷入無(wú)限循環(huán)直到棧溢出。標(biāo)準(zhǔn)庫(kù)判斷到“Unwrap返回了自己”時(shí)會(huì)panic但一旦錯(cuò)誤鏈特別長(zhǎng)這種bug排查起來(lái)反而更隱蔽。更安全的習(xí)慣是自定義錯(cuò)誤類型里永遠(yuǎn)只有一個(gè)cause字段專門用來(lái)保存內(nèi)部的原始錯(cuò)誤。3. 分層架構(gòu)里我堅(jiān)持Wrap的三個(gè)位置穿過(guò)機(jī)制層面落到實(shí)際工程里。我負(fù)責(zé)的項(xiàng)目基本都是經(jīng)典的repository / service / handler三層結(jié)構(gòu)經(jīng)過(guò)這幾年迭代團(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ù)庫(kù)、外部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語(yǔ)句里數(shù)據(jù)庫(kù)驅(qū)動(dòng)的錯(cuò)誤文本已經(jīng)足夠說(shuō)明問(wèn)題而真正需要“哪個(gè)方法做了什么”的語(yǔ)義上下文應(yīng)該由調(diào)用方service層來(lái)補(bǔ)充這樣錯(cuò)誤鏈才不會(huì)有多余的重復(fù)。3.2 service層業(yè)務(wù)上下文在這里統(tǒng)一補(bǔ)充service層是我唯一強(qiáng)制要求Wrap的地方。因?yàn)檫@一層是業(yè)務(wù)的語(yǔ)義邊界你比數(shù)據(jù)庫(kù)驅(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ò)誤來(lái)自哪張訂單、哪個(gè)操作階段。用它替換掉repository層沒(méi)有的信息正好符合前文說(shuō)的“信息增益原則”。而且注意我用的是%w而不是%v這樣上一層還能繼續(xù)用errors.Is判斷sql層的問(wèn)題。service層的另一個(gè)職責(zé)是保持錯(cuò)誤語(yǔ)義的一致性。比如你想暴露一個(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ù)庫(kù)驅(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í)踩過(guò)每次排查都像在剝洋蔥。4.1 套娃式錯(cuò)誤鏈排查時(shí)最怕看到這種日志套娃式錯(cuò)誤鏈的典型特征是每一層都在給同一個(gè)錯(cuò)誤加前綴但這些前綴加起來(lái)不產(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)不是感謝寫代碼的人“考慮周全”而是想問(wèn)他“你到底要讓我從哪里看起”錯(cuò)誤鏈長(zhǎng)度一旦超過(guò)4層中間至少有兩層屬于純儀式性Wrap。而且這種鏈條越長(zhǎng)errors.Is匹配的性能越差雖然單個(gè)錯(cuò)誤鏈沒(méi)那么夸張但架不住請(qǐng)求量大日志的可讀性也呈指數(shù)級(jí)下降。我的經(jīng)驗(yàn)是錯(cuò)誤鏈控制在3到5層之間。repository原始錯(cuò)誤是一個(gè)起點(diǎn)service一次的上下文wrap是關(guān)鍵信息handler在記錄時(shí)做一次“收口”語(yǔ)義補(bǔ)充。超過(guò)5層你幾乎一定能找到冗余的包裝。4.2 日志與Wrap雙重處理等于錯(cuò)誤被處理了兩次第二個(gè)失控場(chǎng)景是“既記錄又返回”。常見(jiàn)寫法是這樣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)里相同信息被檢索出來(lái)三份。社區(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ù)庫(kù)驅(qū)動(dòng)的信息就順著接口漏出去了。外部調(diào)用方不僅能看到“dial tcp: lookup db.internal”這種內(nèi)網(wǎng)地址還能通過(guò)錯(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)證過(guò)fmt.Errorf(xxx: %v, err)輸出文本沒(méi)問(wèn)題但errors.Is找不到目標(biāo)了。于是業(yè)務(wù)里errors.Is(err, ErrOrderNotFound)永遠(yuǎn)返回false最終被handler當(dāng)成“internal error”返回500客戶端拿到一個(gè)沒(méi)頭沒(méi)腦的服務(wù)器錯(cuò)誤。這種問(wèn)題在開發(fā)環(huán)境幾乎測(cè)不出來(lái)因?yàn)殚_發(fā)環(huán)境里大部分請(qǐng)求都成功只有到了線上流量大、分支多的時(shí)候某些異常路徑才被觸發(fā)緊接著就被幾百個(gè)“500 internal error”的告警淹沒(méi)。如果你在排查這類故障時(shí)發(fā)現(xiàn)“明明錯(cuò)誤信息里寫著order not founderrors.Is卻不命中”不用懷疑八成就是某個(gè)位置的Wrap用了%v。5. 一次訂單查詢故障errors.Is如何在三層鏈里精準(zhǔn)定位理論講多了來(lái)一段實(shí)戰(zhàn)復(fù)盤。這是發(fā)生在我負(fù)責(zé)的電商訂單服務(wù)里的真實(shí)案例雖然細(xì)節(jié)做了簡(jiǎn)化但排查鏈路完全還原。5.1 故障現(xiàn)場(chǎng)一個(gè)只留下“internal error”的告警某個(gè)周二下午訂單列表接口的告警突然響起來(lái)成功率掉到97%。當(dāng)時(shí)開發(fā)環(huán)境、測(cè)試環(huán)境全都正常只有線上偶發(fā)性失敗。看告警日志handler層記錄的只有一行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é)開始出問(wèn)題json decode order row。這是當(dāng)初嚴(yán)格按照“repository不包、service包一層、handler脫敏記錄”的規(guī)范留下的成果問(wèn)題在于——光看文本我還是不知道哪張訂單的數(shù)據(jù)壞了。5.2 順著錯(cuò)誤鏈逐層拆解找到真正的壞環(huán)節(jié)接下來(lái)就是用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é)果還真提取出來(lái)了offset精確指向某個(gè)訂單描述字段的斷點(diǎn)。我順著這條線索找下去發(fā)現(xiàn)某個(gè)訂單的payload字段在寫入時(shí)被上游系統(tǒng)截?cái)鄬?dǎo)致JSON內(nèi)容不完整。問(wèn)題定位到數(shù)據(jù)污染而不是代碼邏輯Bug。之所以能這么高效正是因?yàn)殄e(cuò)誤鏈上沒(méi)有斷點(diǎn)repository的原始錯(cuò)誤類型*json.SyntaxError經(jīng)過(guò)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ò)誤要么靠人肉讀日志猜要么把訂單詳情全量拉出來(lái)重新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ì)也寫給你說(shuō)了這么多最后沉淀幾條我在實(shí)際項(xiàng)目中反復(fù)校驗(yàn)過(guò)的原則。它們不是什么高深理論就是寫在團(tuán)隊(duì)Wiki上的約定但確實(shí)讓錯(cuò)誤處理從“個(gè)人品味”變成了“可執(zhí)行的規(guī)范”。6.1 心法一有信息增益才Wrap每次動(dòng)手寫fmt.Errorf(xxx: %w, err)之前先問(wèn)自己這句話有沒(méi)有增加任何一條“前一層不知道的信息”如果有Wrap如果只是給錯(cuò)誤換個(gè)說(shuō)法停手。信息增益這個(gè)判斷標(biāo)準(zhǔn)能過(guò)濾掉八成儀式性包裝。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è)約定越早定下來(lái)后期排查越輕松。6.6 心法六哨兵錯(cuò)誤和自定義錯(cuò)誤類型都是對(duì)外API別輕易改一旦ErrOrderNotFound這種哨兵錯(cuò)誤被定義并廣泛使用它就成為了團(tuán)隊(duì)內(nèi)部模塊之間的契約。改動(dòng)它的文本信息通常還能忍errors.Is是按身份判斷不看字符串但改動(dòng)它的語(yǔ)義范圍或刪掉自定義類型里的字段會(huì)讓所有依賴方一起遭殃。任何對(duì)錯(cuò)誤API的變更都該走和接口變更一樣嚴(yán)格的評(píng)審流程。最后再分享一點(diǎn)個(gè)人感受我見(jiàn)過(guò)太多團(tuán)隊(duì)花大把時(shí)間爭(zhēng)論“要不要Wrap”卻沒(méi)有花十分鐘把錯(cuò)誤鏈的規(guī)范寫進(jìn)文檔。其實(shí)標(biāo)準(zhǔn)庫(kù)errors包設(shè)計(jì)得非常收斂核心就是“保留鏈、可判斷、可提取”這九個(gè)字。真正讓Go錯(cuò)誤處理難用的往往不是語(yǔ)言本身而是我們對(duì)“信息增益”和“層級(jí)邊界”缺乏統(tǒng)一認(rèn)識(shí)。把這兩件事想透了To Wrap or Not to Wrap就不是靈魂拷問(wèn)只是一道有標(biāo)準(zhǔn)答案的工程選擇題。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
激情综合色| 色综合综合色| www.ywav| 国产精品久久7777777精品无码| 五月天天天天天天天天天天天婷婷婷| 高清成人综合| 色呦呦美女| 91啪啪啪啪| 99热这里全都是精品| 婷婷五月天综合久久日美女| 噜噜噜噜噜色| 五月婷婷激情综合网 | 六月亭亭久久综合激情| 色五月激情问网站| 亚洲无码yw| 性爱激情小说AV五月丁香花| 综合久| 五月天丁香成人| 婷婷五月婷婷| 另类小说五月天| 婷婷五月丁香五月| 五月丁香在线综合| 操人91| 丁香五月婷婷基地| 亚洲操逼网| 色色色色色综合| 五月综合久久| 色亭亭影园| 五月婷婷m| 婷婷成人基地| 欧美在线操| 久久综合五月天| 97综合在线| 天天性视频| 国产精品99久久久久久久女警| 激情丁香淫荡婷婷| 九九亚洲无码| 99视频| 播丁香五月婷婷欧美| 六月丁香婷婷色综合| 日本久久婷| site:pnnrt.com| 看全色黄大色大片| 99精品视频在线观看| 精品久久99| 狠狠色综合网站久久久久| 一级片sese片.COM| 九九综合88| 色婷丁香| 天天射射夜| 色婷婷综合在线| 97人人看| 色婷婷丁香五月在线观看| 日韩人妻AV在线| 久久精热| 综合色色婷婷| 欧洲亚洲免费视频区| 久久99日本精品视频免费观看| 色五月色五天色情网| 五月丁香色婷婷伊人| 9热在线| 可以免费观看的AV| 操人妻视频91| 欧美日本韩国亚洲| 日本五月天网站| 亚洲色婷婷| 欧美槡BBBB槡BBB少妇| 丁香婷婷婷五月| 五月丁香激情啪啪| 丁香六月狠狠干| 色色网站毛片| 大香蕉婷婷| 这里只有精品久久| 丁香5月婷婷| 亚洲激情综合| 超碰在线免费| 国产精品日日躁夜夜躁| 激情婷婷网| 91精品久久久久久77777| 婷婷五月天黄色小说| 亚洲性天天| 男人的天堂99| 中文字幕在线人妻| 婷婷五月成人| 色色亚洲| 日本熟妇乱妇熟色A片蜜桃| 类似婷婷激情综合网站| 天天色噜| 欧美日韩成人高清在线| 亚洲色热| 久久久精品AV| 婷婷五月综合啪| 99热传媒| 欧美成人AAA片一区国产精品| 亚洲不卡| 国产在这里只有精品| 久久婷婷丁香| 伊人干综合| 色五月婷婷在线| 色婷五月天综合网| 99亚州综合精品成人网| 欧洲综合色| 电影《战争与艾拉》免费观看| 久久精品五月天| 激情图片99| 黑人糟蹋人妻HD中文字幕| 色色色成人网| 97人人射| 五月激香蕉网| 9久久AV| www.cao.com久久| 久久一级AV| 五月激情小说| 思思热99er| 激情又色又爽又黄的A片| 久久思思热| av在线资源| 少妇人妻人伦A片| 久久丁香久久| 中文字幕婷婷在线| 无码人妻激情| 99极品视频| 日本本土色网第一区| 久久综合性| 亚洲五月天婷婷| 婷婷丁香五另类网站| 一区视频网站| www.五月婷婷久久.com| 五月婷婷五月天在线 | 婷婷激情综合色五月久久图片| 亚洲第一成人无码A片| AA片在线观看视频在线播放| 九九九九无码| 久久婷婷五月综合97色一本| 六月香五月婷| 九九视屏| 色婷婷六月| 蜜臀av 粉嫩av 懂色av| 91丁香五月| 色婷婷综合网站| 深爱五月婷婷开心中文字幕| 六月激情婷婷| 婷婷色婷婷| 精品人妻一区二区三区在| 日本激情综合| 99爽视频| 婷婷精品性性性性性性性| 99色色色色| 狠狠色丁香婷婷久久综合| 色婷婷另类| 五月久久婷婷天堂视频| 欧美在线骚货| 99热免费精品| 婷婷五月丁香基| 激情五月天福利| 69色婷婷| 天天撸天天干天天插| 人人草人| 精品人妻伦一二三区久久| 免费视频WWW在线观看网站| 欧美性猛交99久久久久99按摩| 99久热在线精品99re6热| 2017人人操| 丁香六月婷婷开心| 操碰99| 天天日夜夜爽| 丁香久久综合| 色五月人妻| 丁香五月天电影| 丁香婷婷激情四射五月| 色噜噜狠狠色综合日日免费| 成人午夜无码视频| 五月天伊人久久久久| 五月天婷婷香蕉狠狠超碰综合| 99热精在线九九久久保| 97色干| 国产毛片精品一区二区色欲黄A片| 热99.com婷婷| 人妻videos人妻高清| 九九热99免费视频| 色99超碰| 亚洲色婷婷五月| av九九| 在线观看欧美3区| 欧美性交一区二区三区| 啄木鸟丝袜美女福利视频| 5月丁香啪啪啪| 久久综合99综合| 淫视馆AV在线| 色婷婷六月天| 精品九九网| 99免费成人网| 九九热免费| 丁香五月婷综合| www.久久五月天.com| 精品网站:999WWW| 97干在线视频精品店| 熟女91九色| 99精品在线下载| 亚洲色婷婷网站| 婷婷香蕉| 色婷婷影院| 九九综合| 日韩日比视频| 91大神操美女| 综合大香蕉| 久久五月丁香| 铁牛TV人妻| 丁香五月综合AV在线| 婷婷中文字幕网站| 激情五月婷婷综合色播小说| 九九九激情网| 玖玖九九99| 欧美婷婷| 538久久| 五月天综合在线| 99久久99久久综合| 另类激情五月在线视频欧美| 棕合影院色色| 天天插天天爽| 91精品电影18T| 99人人干| 欧美激情五月天在线观看| 99超级碰免费视频| 婷婷丁香五月六月激情| 影音先锋AV资源男人站| 99re6久热只有精品6在线直播| 91干婷婷| 人人爱人人草| 日本高清久久| 内射人妻视频国内| 久久久久丁香婷婷五月天| 亚洲性爱AV| 思思热AV| 精品牛仔裤超碰| 欧美色色色色色色色| 中文字幕黄色片| 色情成人五月天| 六月亚洲婷婷6月中文字幕| 91大神操美女| 99网| 婷婷深爱五月天| 久久婷婷的综合色丁香五月| 99热a片免| 日韩三级视频一区二区| 精品一区二区三区四区五区六区| 婷婷五月天久久| 亚洲最大五月天成人网| 五月永久激情| 激情涩涩网| 影音先锋91资源站| 久久亭亭电影| 日韩AV在线免费| 免费黄色片子| 天天综合精品| 天天插天天爱| 97干综合网| 99热思思在线观看| 99在线观看精品| 99天堂在线观看免费视频| 日韩超碰在线| 中文字幕在线不卡| 夜夜撸天天日| 色五月婷婷天天操夜夜操| 色一情一乱一乱91Av| 九色在线五月婷婷网址| 狠狠爱深色婷婷综合| 囯产精品久久欠久久久久久九大| 五月激情婷婷在线| 激情九月婷婷| 成人做爰黄A片免费看直播室男男 A片试看120分钟做受图片 | 久操人| 91精品激情9| 五月香婷婷| 伊人久久五月天综合| 好好日激情五月天| 成人综合AV| 亚洲AV成人在线观看| 色久综合| 日本99热| 欧美婷婷五月天| 色六月视频| 青草热视频这里只有精品| 婷婷色激情网| 五月色情婷婷开心五月色情| 国产一区男女| 色五月激情婷婷| 天天日夜夜帕| 5月婷婷6月六月丁香| 婷婷五月天啪啪| 色J香五月天| 色狠久| 久久人妻乱| 五月丁香五月综合欧美| 97AV在线视频| 亚洲性受XXXX五月丁香| 丁香月五月天婷婷久久| 丁香六月天之亚州热女| 婷婷五月天网| 99热这里只有精品8| 六月婷婷亚洲| 五月综合久久| 六月丁香啪啪| 四色五月婷婷| 99久久久免费| 婷婷丁香亚洲五月天| 五月天停停基地| 人人干Av| 天天综合五月| 日韩精品AV一区二区三区| 少妇性BBB搡BBB爽爽爽视頻| 一级二级色大片| 久久网日本| 久久九九免费大视频| 开心婷婷五月天电影院| 玖玖资源站中文| 丁香五月天在线| 99性爱视频网站| 婷婷综合在线观看视频| 成人婷婷| 五月丁香| 人操人| 99国产在线精品视频| 免费观看日韩成人av| av在线激情| 婷婷五月天激情网址| 五月天激情网址| www.99热视频| 久久精品99国产精品日本| 99riAV成人在线视频| 神马欧美精| www.超碰在线| 99在线亚洲| 99热18| 五月天色色无码| 三级99热| 操丝袜视频影院导航| 99亚洲视频| 婷婷中文字幕| 五月丁香 啪啪| 欧美激情五月综合| 免费啪啪亚州视频| 亚洲成人AV在线| 99热国产在| 99热这里只有精品无码| 操人91| 欧美日韩国产一区二区| 深爱网深爱综合网| 日本三级中国三级99人妇网站| 婷婷.com| 思思综合热| 丁香婷婷色五月| 天花AV无码| 日本狠狠爽| 最新久久网址| 综合久久五月天| 天天天摸夜夜夜玩| 色色99| www久久久久久久97| 99亚洲色| 色级停停| 精品人妻久久久| 青青草激情网| 午夜成人AV在线| 亚洲热视频| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 依人大香蕉在钱1| 97亚洲色 torrent magnet| 丁香婷婷九月| 婷婷99狠狠躁天天躁中文| 久久九九99亚洲国产久精综合| 色色色色网站| 91丨九色丨熟女| 色无码| 国产超碰av| 天堂婷婷五月在线| 懂色av蜜臀av粉嫩av永陈冠希| 婷婷色五月激情| 激情图片99| 果冻传媒A片一二三区| www色婷婷久久综合久色| 丁香五月激情网| 99热一本| 99er精品| 亚洲婷婷五月天| 大地资源色婷婷视频在线| 欧美五月婷婷| 丁香狠狠色婷婷| 99精品无码网站| 四川BBB搡BBB搡多人乱亂| 99rewww| 九九视频在线观看| 狠狠肏综合网| 日韩久久系列| 色色性爱视频| 超级97碰碰| www婷婷| 九月久久婷婷| 色色色色色色色色网站| 五月天天综合| 婷婷大香蕉| 欧美va视频| 99re这里只有| 激情五月六月丁香| 伊人丁香五月婷婷潮吹| 日韩成人AV在线| 婷婷五月天播| 99精日本久久| 丁香五月六月婷婷综合| 性五月激情| 国产精品a无线| 久热视频这里只有精品68| 五月丁香婷婷综合视频| 精品99视频| 香蕉综合网| 伊人超碰| 成人av播放| 日韩婷婷五月| YW无码| 思思99久久| 久久精彩免费视频精彩免费视频| 激情操逼婷婷| 五月丁香激情啪啪| 涩涩涩.com| 色久影院| 久久婷婷一级片| 五月丁香六月停停| 秋霞成人毛片一级A片| 日韩另类| 夜夜骑日日操| 99re免费在线视频| 天天色天天操天天射| 日日艹思思热| 少妇日麻屄| 午夜丁香 婷婷| 怡红院一二三| 婷婷久久五月天亚洲欧美国产日韩在线观看| 亚洲天堂玖玖| 丁香五月婷婷亚洲色图| 色欲色香综合网站| 色色热| 色色色色色色色色网站| 狠狠夜夜五月丁香| 欧美三级欧美一级| 国产美女无遮挡裸体毛片A片| 五月天综合视频网| 袁子仪视频观看| 91色呦哟| 天天做天天爽| 激情综合亚洲| 五月综合在线| 激情六月丁香| 国产综合久久久777777| 色欲AVV| 玖玖爱综合网| 亚洲操B| 人人操A| 婷婷97C| 大香蕉九九| 玖玖婷婷色五月| 欧美VA在线观看| www.五月激情.com| 久久亚洲精品成人无码网站导航| 久久久久亚洲AV无码网影音先锋| 97香蕉人人在线观看| 91久久精品国产91性色TV| 婷婷视频网| 99热这里都是精品| 成人丁香五月| 天天草天天摸| 色色色色色色网| 色五月婷婷五月丁香五月| 99国产精品久久久久久久久久久| 五月丁香免费看| 欧美五月婷婷| 五月综合视频| 99a级片| 久久久久久久久99精品| www久久久久久久97| 婷婷激情五月综合丁香社| 欧美精品久久久久久视频观看| 91啪啪视频| 大香蕉伊人99| 五月天婷婷av| 久久人妻久久久久| 狠狠色婷婷7777久| 亚洲成色综合网站免费观看| 狠狠人妻久久久久久综合丁香| 做爱夜夜干天天操| 99视频精品8| 久久婷婷亚洲五月天| 激情五月天在线观看色婷婷| 美女天天久久| 激情五月丁香色婷婷| 少妇激情五月婷婷| 久色成人| 五月六月婷婷| 狠狠色狠狠| 婷婷色婷婷| 五月天播播| 欧美经典片免费观看大全| 丰满女老板BD高清A片| 狠狠精品干练久久久无码中文字幕| 综合色情网| 五月激情婷婷综合| 亚洲色啪| 色综合久久88色综合天天| 丁香色影院| 中美月韩免费A片| 综合玖玖性爱免费视频| 久久在线人妻| 欧美色久| 国产精品日本一区二区在线播放| 婷婷五月天亚洲综合| 色狠狠综合| 九九無妻| 婷婷五月天色色| 不卡在线中文字幕无| 色五月开心久久网| 婷婷月五天在线在线看| 色性五月天| 伊人狠狠丁香婷婷综合尤物| 丁香五月AV| 天天肏天天舔AV| 久操大| 五月色欧美| 天天操综合网| 国产69久久久欧美黑人A片| 日本偷拍九九九| 97精品综合久久| 色五月色综合| 色五月丁香五月| 婷婷丁香日韩五月| 五月激情射| 97色碰| 丁香五月婷婷少妇| 99综合自拍| 4399无码视频| a网站免费观看| 婷婷深爱五月丁香| 欧美三级巜人妻互换| 综合狠狠干| 米奇影视资源777狠狠色婷婷五月天激情网| 五月婷婷丁香五月天| 国产亚洲99久久精品| 99色在线视频观看| 开心五月婷婷在线视频免费观看| 夜夜操夜夜操| 欧美日比视频| 少妇激情五月天| 大战熟女丰满人妻AV| jiujiujiuwuyuetian| 98毛片| 久久精品夜色噜噜亚洲a∨| 中文字幕网伦射乱中文| 欧美搡BBBBB摔BBBBB| 操逼巨乳91| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | http:色情日本com| 91干| av在线免费网站 | 粉嫩AV久久一区二区三区| 综合色吧| 久久婷婷视频| 婷婷久久女人| 天天情色综合网| 九九热精品| 大香蕉Av在线| 五月天综合久久| 欧美色必爱| 26uu| 婷婷丁香综合网| 思思99精品视频在线观看| 青青草激情网| 婷婷综合欧美| 婷婷丁香六月天| 人人操91| 婷婷成人五月天成人文学| 精品导航在线x不卡| 婷婷五月天首页| 5月丁香美女影院| 我要射综合| 久久大大香| 操人妻视频91| 日本啪啪网| 大香蕉手机视频| 婷五月天天| 欧亚成人A片一区二区| 操逼福利视频| 婷婷狠狠青青| 五月丁香六月在线| 成人电影在线免费试看| 午夜丁香婷婷| AV伊人青草丁香六月| 九九99久久| 亚洲精品五十一区| 九九婷| 婷婷色情五月| 婷婷久久性爱| 色婷婷丁香五月| 欧美综合婷婷欧美综| 精品欧美一区二区三区久久久| 亚洲瑟瑟精品在线| 午夜九九九九九九| 影音先锋色婷婷| 26uuu欧美日韩| 丰满少妇猛烈A片免费看观看| 色五月五月丁香| 丁香五月激情啪啪啪啪| 伊人玖玖婷婷| 亚洲婷婷基地| 无码毛片992367| 99免费超碰在线| 婷婷五月天欧美图片在线播放电驴| 日本少妇AA一级特黄大片| 欧美日韩成人在线网| 欧美在线视频99| 无码成人AAAAA毛片AI换脸| 色爱终和网| 91色在线| 婷婷五月丁香图片人人操| 思思热久热| 国产精品久久..4399| 成人做爰高潮A片免费视频| 久久AV电影| 色情五月婷| 久久人妻熟女一区二区| 五月婷婷开心网| 五月丁香久久久日婷婷久久婷婷日| 亚洲性爱AV| 五月激情视频| 538任你爽| 五月天电影网| 色丁香五月婷婷婷| 91色色色18| 97人碰人操| 天天拍天天操| 欧美久久网| 人人操人人爱丁香五月| 99热这里只有在线播放| 大香蕉精品视频| 亚洲欧洲小视频9| 99热这里都是精品| 天天色天天日| 99re免费精品视频| 第四色大香蕉| 五月在线| 99免费视频网| 日韩精品无码99| 五月天婷婷在线观看精品男人| 婷婷99中文字幕| 黄页免费一级视频懂色| 伊人网色婷婷五月天| 99ri视频| 五月丁香综合啪啪| 色婷婷在线视频| 亚洲无码播放| 97久久人人操| 999婷婷综合| www.色五月| 六月丁香激情网| 天天干天天爽天天操| 久久综合66| 国产又爽又猛又粗的视频A片| 婷婷综合网| 99色天堂| 日韩成人免费电影| 大香蕉啪啪啪| 久久天天| 青草视频在线观看视频| 五月婷婷五月天| 天天爽天天爽| 9久热精品在线视频| 精品亚洲国产成AV人片传媒| 97精品人人A片免费看| 久久五月丁香| 午夜精品久久久久久久爽| 成熟妇人A片免费看网站| 中字幕视频在线永久在线观看免费 | 久久久免费精彩视频| 26uuu亚洲欧美日本| 色色哒五月婷婷六月丁香| 天天插天天插天天插| va婷婷| 九九热这里| 激情综合国产| 五月婷婷在线视频| 亚洲字幕AV一区二区三区四区| 免费超碰在线观看| 丁香久久激情俄| 亚洲AV无码成人精品区电影网| 婷婷九月狠狠色| 天天噜日日噜综合无码| 婷婷五月丁香六月伊人网| 无码中文一区二区三区| 可以直接看的AV网站| 亚洲无码色色| 色五月天综合网| 嫩草AV久久伊人妇女超级A| 日逼影音先锋男人AV资源站| 久久网址99热| 国产91视频| 情欲综合网| 五月婷婷婷婷网| 婷婷午夜激情| 国产偷人爽久久久久久老妇APP | 综合激情在线| 丁香五月婷婷姐| 婷婷五月天电影在线| 五月天色不卡| 少妇性按摩无码中文A片| 五月天大香蕉av| 久久激情天堂| 人妻videos人妻高清| 天天操人人干| 久久丁香五月天| 丁香久久激情俄| 亚洲超碰在线| 影音先锋777xfplay色资源网站| 五月婷婷99热| 狠狠色噜噜狠狠狠777奇米| 九九re精品视频在线观看| 婷婷亚洲五月丁香综合在线 | 色色婷| 99久久精品视频女神1| 97干网站| 丁香啪啪中文字幕| site:pzdcoin.com| 五月天激情综合| 成人综合网站| 另类图片天天影视在线观看| 无码色色| 最近中文字幕大全免费版在线| 色涩影院六月丁香| 丁香五月天五码婷婷| 成人网站在线观看视频| 99啪视频在线观看| 婷婷六月网| 日韩一级片| 婷婷五月天性爱视频| 激情精品久久| 五月天啪啪| 六月激情网| 亚洲精品性色| 天天爽天天| 久9久9久9久9久9久9| 99热这里只有精品免费观看| 夜精品无码A片一区二区蜜桃| 日韩操逼大片| 婷婷五月天堂| 婷婷五月成人社区| 四虎婷婷五月天| 99热这里只有精品中文字幕| 99日逼视频| 六月婷婷在线视频| 在线视频九色97| 亚洲综合干| www.夜夜| 狠狠色丁香五月婷巨| 婷婷丁香色情| 丁香五月婷婷偷拍| 久久九九色| 东北熟女高潮99综合99| 国产精品A片| 国产毛片精品一区二区色欲黄A片 国产人妻777人伦精品HD | 五月丁香拍拍激情综合| 婷婷天堂站| 五月丁香香蕉| 欧美内射AA| 亚洲成人在线免费| 色色免费网站| 五月天激情久久| 91ncm视频| 色婷婷777狠狠| 色域五月婷婷丁香| 性视频久久| 97精品欧美91久久久久久久| 五月丁香六月成人| 色~性~乱~伦~噜| 91超级碰在线视频| 五月丁香婷婷色色| 婷婷97| www.zbzhongsen.com| 综合亚洲色色| 亚洲日本韩国| 天天天天做夜夜夜夜做| av中文字幕免费观看| 人色五月天婷婷| 国产一级视频a| 操逼在线视频| 99情色五月天| 婷婷色五月天在线观看| 亚洲无码黄色| 五月天激情久色| 黄色av高清| 五月天婷婷乱论小说| 色五月,婷婷大香蕉| 99色视频| 超碰女人天堂| 天天爽天天干| 九九亚洲小视频| 色五月激情综合网站| 五月天最新网| 人妻人人操| 九九热在线视频| 五月丁香色狠狠干大屄| 精品热九九| 久热亚洲| 入口五月婷婷六月香| 少妇AB又爽又紧无码网站| 午夜天堂一区人妻| 六月丁香社区| 五月激情综合网| 99热精品免费| 五月天婷婷婷| 好看的国产精品| 99爱视频| 天天久综合| 99操逼| 99色爱| 99乱视频| 新99思思视频| 91亚洲天堂| 色色a| 日本va视频| 丁香五月激情综合婷综| 九九免费视频| 色婷亚洲| 日本三级中国三级99| 熟女人妻一区二区三区免费看| 久久精品亚洲一级牲爱综合| 黄色片区子| 欧美性猛交99久久久久99按摩| 丁香六月婷| 伊人影音无码一区二区三区| 日韩AV成人电影| 天天狠狠夜夜狠狠2023| 丁香五月亚洲天堂| AV堂狠狠干| 婷婷综合在线网| 亚洲精品99| 99视频这里只有精品10| 天天开心婷婷丁香五月| 91窝窝| 日本不卡高字幕在线2019| 五月丁香色婷婷基地| 97人人操| wwww.色婷婷| 狠狠色婷婷777| 五月丁香婷婷网在线在线| 五月丁香六月婷婷啪啪综合| 2022人人操人人看| 无码人妻少妇色欲AV一区二区| 99热只有| 深爱丁香激情| 婷婷亚洲五| 五月丁香大相交| www天堂99| 五月天伊人| 久久五月激情综合| 激情五月丁香亭亭| 狠狠操天天日| 久热这里只有精品在线观看 | avh片在线观看| 久热这里只有精品99re| 精品皮股午夜AV| 99在线观看视频| 北京熟妇搡BBBB搡BBBB| 综合久久综合久久| 色五月婷婷五月天激情综合| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 嫩草AV久久伊人妇女超级A| 色激情综合| 色婷婷亚洲五月天| 五月 婷婷 成人| 亚洲综人色综网| 99热精品在线观看| 婷婷五月18永久免费视频| 激情另类综合| 天天爽成人综合网站| 色婷婷五月天天天干天天操天天爽| 高清a片基地| 色五狠狠| 9色在线视频精品观看| 婷婷久久五月天| 91蜜桃婷婷狠狠久久综合9色| 亚洲啪| 丁香婷婷老熟女综合网| 婷婷开心激情| 亚洲av骚货| 99热综合| 大香蕉手机视频| 激情综合亚洲| 欧美大香蕉视频| 五月婷婷偷拍| 五月丁香婷婷爱| 人妻久久久| 亚洲在线综合| 五月丁香六月成人| 婷婷在线免费| www.五月婷婷久久.com| 婷婷激情五月| 九九色综合| 人妻AV在线| 人妻丰满精品一区二区A片| 日本狠狠干| 亚洲色就是色色色| 丁香婷婷狠狠97| 久久精品日| 玖玖综合玖玖| 插逼综合网| 婷婷五月激情四月综合 | 日韩AV片| AⅤ网站在线看| 色婷婷yy久| 操比激情五月综合| 激情视频91| 九九这里只有精品在线视频| 综合激情伊人影视在线| 国产精品色色色色| 丁香六月激情国产| 婷婷五月天av| 日韩啊啊啊| 熟妇人妻中文字幕无码老熟妇| 熟女强人妻一区二区三区四区无| 全部老头和老太XXXXX| 九月婷婷在线视频| 日本99视频精品免费播放| 久热 91| 久色姿源| 婷婷激情五月色综合| 欧美在线97| 国产精品色| 婷婷情色五月| 婷婷亚洲综合| 天天日夜夜草进麻麻的子宫| 久久久性爱视频| 国产成人+综合亚洲+天堂| 日本一级一级一级一级| 免费日本aⅴ中文字幕| 久久婷婷五月综合啪| 18av天堂| 五月丁香九九九综合| 综合激情视频| 99热精品在线| 久操大屁股女人av| 九九99久久| 亚洲综合色棒| 婷婷丁香五月天激情| 婷婷丁香红五月91C| 九色91视频| 丁香五月激情站| 婷婷丁香九月| 色五月丁香A欧美com| 26uuu偷拍亚洲欧洲综合| 免费的日逼视频| 欧美激情综合五月色丁香| 天天干,夜夜爽| 9九九久久精品无码专区| 97碰碰在线观看视频| WWW、日本色丁香、co m| 六月激情丁香一道本7777| 五月丁香手机在线| 人妻啪啪啪| 午夜丁香| 日本69日人视频| 9久热这里只有精品| 五月激情在线| 全高清无码视頻| 色婷婷五月综合网| 337p大胆噜噜噜噜噜91Av| 大香伊人婷婷| 五月丁香久久综合精品| 久综合网| 97婷婷五月激情六月丁香伊人| 久久五月婷综合网| 99re这里| 五月婷婷伊| 欧洲亚洲免费视频9| 久久99热这里只频精品6学生| www,婷婷,com| 精品成人在线观看| 久热视频这里只有精品| 成 人片 黄 色 大 片| 成人免费在线电影| 丁香五月成人社区| 波多婷婷久久| 天天看片日日夜夜| 99热这里只有精品3| 在线91日韩| 五月婷婷开心综合| 色色色com| 久久这里只有精品07 | 亚洲日韩乱码一区二区三区四区 | 久操热| 任你爽精品免费视频6| 五月丁香中文| 一区中文字幕电影| 色情久久久| 蜜乳久AV| 色五月婷婷久久大| 专区无日本视频高清8| 丁香婷婷精品视频| 9久久精品| 成人丁香五月| 色五月综合激情| 91porn一起草| 五月天婷婷基地综合网| 丁香五月综合激情性爱 | 九九色综合| 九九热在线观看6| 久久伊人婷婷| 超碰在线看| 亚洲成人综合在线| 中文字幕在线日亚州9| 亚洲成人免费电影| 午夜成人AV在线| 激情五月丁香五月| 激情深爱婷婷网| 深爱五月婷婷| 色综合久久88色综合天天人守婷| 91狠狠色色丁香婷婷综合久久| 色人久夂| 亚洲免费婷婷| 婷婷丁香色五月亚洲| 丁香久久| 俺去也在线www色官网| 99精品视频播放| 久久久久丁香婷婷五月天| 男人的天堂97| 欧美Va婷色| 99re6热在线精品视频播放速度| 日本人妻A片成人免费看片| 午夜婷婷丁香| 午夜69成人做爰视频| 丁香五月丁香伊人| 野外99热| 天天搡日日搡aaaaⅩ| 天天肏夜夜肏| 色婷婷成人做爰A片免费看网站| 五月天成人手机在线视频| 五月丁香婷婷欧美色图视频五月丁香777电影| 欧美狠狠地| 中文字幕人妻AV| 91热网址| 伊人大香五月天| 亚洲成人AV高清字幕| 日本婷婷色日| 婷婷色在线| 另类少妇人与禽zOZZ0性伦| 久久精品永久免费| 丁香五月欧美| 久热中文字幕| 少妇出轨做爰高潮A片| 99国产视频网| av在线观看网站| 日日躁夜夜躁狠狠久久AV| 可以直接看的AV| 色伊人婷婷| 色www久视频| 色欲午夜无码久久久久久张津瑜| 色情五月综合婷婷| www.91热久久| AV在线观看网站| 91精品熟女| 丁香花婷婷五月天| 殴美激情综合网| a69在线视频| 久久婷婷资源| 色综合中文| 玖玖九九99| 日本99在线视频| 无码人妻少妇色欲AV一区二区| 国产精品VA在线| 91操色| 加勒比久热| 99热精品在线在线| 五月天天久久香| 丁香五月婷婷姐| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 天天搞天天爽| 亚洲国产精品五月天| 成人AV网站在线| 成人.在线日韩| 日本色天堂| 午夜丁香五月天综合| AV激情五月| 操日本色| 九九色情网站| 丁香午夜天| 五月婷婷丁香俺日污视频| 久久与婷婷| 久久伊人婷婷| 婷婷丁香五月综合久久| 丁香六月婷婷| 婷婷久月| 一根材五月婷成人| 亚洲永久免费| 大香蕉大香蕉在线影院| 国产日产亚系列精品版优势| 欧美在线97| 五月丁香色婷婷| 久久思思热视频| av在线超清中文| 国产99久久久| 亚洲免费av在线| 狠狠色噜噜狠狠狠狠狠色综合久久| av中文在线| 狠狠色狠狠操| 久大香蕉| 丁香五月天激情综合| 天天做天天爱天天综合| 婷婷丁香午夜综合影视| 久久五月丁香婷婷| 色婷婷综合久久| 超级黄色片| 五月丁小婷婷激情四射| 国产在线aaa片一区二区99| 久久性爱视频| 九九热最新| 99综合| 五月婷在线播放| 人人摸人人射| 人妻五月天激情开心网| 五月丁香好婷婷姑娘综合网| 久9久9热久热| av网址在线| 99热99干| 久操热| 欧美久久婷婷| 五月激情综合网| 99这里有精品视频| 在线中文亚洲| 婷婷五月AV| 六月丁香久久| 激情五月天视频| 婷婷五月四狠狠| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 狠狠久综合| 丁香五月婷婷亚洲色图| 99热新网址| 久久色五月| 亚洲AV成人精品日韩在线播放| 五月天综合在线| 日韩999| 九九精品片一| 亚洲五月综合色播| 99免费视频在线观看爱| www.激情五月天com| 五月开行婷婷色五月| 天天爽夜夜爽夜夜爽精品视频| 俺去也五月天婷婷| 五月综合色| 欧美内射AA| 天天插天天爱| 欧美交换配乱吟粗大25P| 成人午夜天| 99欧美热| 人人操人人添人人摸97| 激情国产综合| www久| 三十路磁力链接| 久色国产| 91九色精品| 五月色网| 成人婷婷色综合| 欧美色偷偷大香| 色婷婷狠| 五月天成人网婷婷| 亚洲色婷婷视频| 97人人操| 99精品视频在线观看| 国产高潮白浆一区二区| 国产免费av在线| 午夜色色色极品视频| 99热这里有精品24| 五月天天爽| 九月丁香婷婷| W色综合| 99艹精品在线观看| 色婷婷久久综合久色综| 激情婷婷综合| 色五月人妻| 五月天婷婷在线AN| 色综合综合综合| 九九99九九99偷拍视频免费看| 婷婷综合五月天激情| 天天日夜夜帕| 思思热视频| 综合九色| 五月婷婷啪啪网| 日韩婷婷五月天| 超碰色综合| 色婷婷丁香花五月天| 亚洲AV无码影院| 99re这里只有精品视频6| 色婷婷亚洲婷婷在线观看| 日本色色网| 人操人| 天天色天天爱天天舔| 婷婷综合五月天| 国产亚洲精品久久久久久久久动漫| 丁香六月色| 开心五月丁香综合久久| 国产精品色婷婷久久久精品| 91操人视频| 激情中文在线| 婷婷五月精品中文字幕| 开心深爱激情网| www.久久久久久久久久.com| 伊人五月天综合网| 婷婷日欧美在线观看| 久久99热网| 亚洲天堂爱爱| 婷婷性爱五月天| 亚洲日韩久久婷婷伊人| 性色人人爽| 操日本99| 精品人妻伦| 色九九综合| 天天干天天操天天射| 丁香五月婷婷色五月| 国产成人AV在线| 狠狠综合色网| www.粉嫩av.com| 4438激情网| 爱狠射| 婷婷五月六月丁香综合| 97九色视频| 色婷婷综合丁香五月天| 丁香激激情网| 中文字幕丰满孑伦无码专区| 五月婷婷久久久| 婷婷五月色播| 爆乳熟女-区二区三区| 伊人婷婷五月| 丁香六月综合激情| 99热日韩| 玖玖综合色| 任你搞网站| 五月深爱激情网| 中文字幕精品无码一区二区| 五月丁色AV| 99久在线精品99re8| 婷婷五月综合激情| 激情综合网五月| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 國語久久婷| 丁香六月婷婷久久高清| 六月婷婷五月天| 日本 色综合| 五月天婷久精视频| 亚洲色五月婷婷| www.激情五月| 9热久久在线| 天天噜噜| 婷婷五月色惰| 久久玖玖综合| 2013AV天堂| 日本久久人| 无码人妻电影| 精品久久久人妻| www.99在线| 五月激情综合网| 丁香桃色综合网| 91夫妻视频|