精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我已經受夠了“系統異常”!

系統 其他OS
給系統異常后面帶了個 flag 標識,當出現問題時,根據標識就能快速定位日志來排查問題了,對于有完善日志系統(如 ELK)的項目來說已經大大改善了程序員們的生存狀況。

作為用戶,你有沒有這樣的經驗:用個軟件,隔三岔五彈個框:系統異常!

作為程序員,你有沒有這樣的經驗:

運營同學又屁顛屁顛跑來求助:“用戶不能下單了!”

“報什么錯?”

“系統異常!”

無論作為用戶還是程序員,一見到“系統異常”四個大字,我整個人都不好了。

它除了告訴我系統出問題了,沒有任何有價值的信息。

這往往是程序員一天苦逼生活的開始。

我們獲取不到任何有價值的信息,只能到處抓蝦。

先看看系統負載,嗯,沒問題。

再看看錯誤日志,一大堆日志滾來滾去,也看不出所以然。

于是我們不得不求助運營同學:“去要一下用戶手機號或者賬號,手機型號、版本,最好能錄個頻!”

等了半天,運營妹妹終于搞來了這些信息,于是我們又一頓各種查日志,然后盯著代碼一行一行找,最終發現了 bug 所在。

為何會有“系統異常”?

喜歡將對外錯誤信息一股腦寫成“系統異常”的,一般處于以下幾種原因:

  1. 剛入行的小白,尚未深入體驗程序員的苦難生活。
  2. “敏感信息”信徒,對他們來說,任何系統錯誤信息都屬于敏感信息,需要“包裝”一下。
  3. 高敏行業,公司強制要求。

我見過一些系統是這樣處理的:

class BaseController {
    errorHandler(err) {
        this.response.sendJSON({code: 500, message: '系統異常'})
    }
}

意思是,該系統的所有 throws 都被轉成“系統異常”!

關鍵還連個日志都不記錄!

后續的開發人員為了方便定位錯誤,便在業務層代碼里面各種 log,業務代碼慘不忍睹。

“系統異常”們的改進

上面那種極端的代碼是比較少見的,一般遇到更多的是這樣:

class BaseController {
    errorHandler(err) {
        // 生成異常標識并記錄日志
        let flag = random()
        log(err, flag)
        this.response.sendJSON({"code": 500, "message": `系統異常(${flag})`})
    }
}

給系統異常后面帶了個 flag 標識,當出現問題時,根據標識就能快速定位日志來排查問題了,對于有完善日志系統(如 ELK)的項目來說已經大大改善了程序員們的生存狀況。

但上面的代碼有什么問題呢?

試想某支付邏輯有如下代碼:

if (balance < amount) {
    throw new NotEnoughException('卡余額不足')
}

余額不足,很常見的場景,但用戶看到的是這樣的提示:“系統異常(1877618)”。

此時,我不知道用戶和程序員有沒有崩潰,至少你的老板是崩潰的。

“錯誤碼”們橫空出現

“系統異常”們搞出的事情令人猿共憤,如今這些信徒已經不多了,要么迫于壓力改邪歸正了,要么被主管開除殆盡了。

如今,你更可能遇到的是這樣的代碼:

配置文件:

// 全局:定義統一的錯誤碼和錯誤文字
const OK = 200
const SYS_ERR = 500
const NOT_FOUND = 404
const NOT_ENOUGH = 405

const map = {
    200: "OK",
    500: "系統錯誤",
    404: "未找到資源",
    405: "余額不足",
}

// 錯誤碼轉文字
function error(code) {
    return map[code]
}

業務層代碼:

if (balance < amount) {
    // 該自定義異常類僅允許傳入錯誤碼,內部根據 error() 函數轉文字
    throw new MyException(NOT_ENOUGH)
}

控制器:

class BaseController {
    errorHandler(err) {
        log(err)
        this.response.sendJSON({"code": err.code, "message": err.message})
        // 或者:this.response.sendJSON({"code": err.code, "message": error(err.code)})
    }
}

這種錯誤處理原則是通過錯誤碼統一整個項目的 code 和 message,開發人員不能在程序中自己定義錯誤描述。

我稱這類程序員為”錯誤碼“信徒。

“錯誤碼”們主要的擔心是:如果讓開發人員自己在代碼里面定義錯誤描述,會導致“哈莫雷特”問題,即每個人的描述可能都不一樣,而且有可能會導致敏感信息泄露。

相對于“系統異常”們,“錯誤碼”們已經有了長足的進步,大家終于知道系統發生了什么樣的錯誤,老板們也不用擔心因客戶卡余額不足導致的“系統異常”砸了品牌形象了。

從此人猿共歡了!

從此人猿共歡了?

用戶購買 500 元商品時提示“卡余額不足”,但更好的提示應該是“卡余額不足,當前可用余額 420.00”。

當根據 userId 查不到用戶信息時,應該提示“用戶不存在”,但不能保證開發人員因不想定義新 code 而直接使用 404(未找到資源)。

錯誤碼機制的問題是其文字提示過于籠統,導致在某些錯誤場景下丟失重要價值信息(進而導致問題排查上的困難,問題遲遲得不到解決),另一些場景下則帶來不好的用戶體驗。

對于開發人員來說,它會帶來兩種效果:一些開發人員不想新定義一大堆錯誤碼,于是將就著使用現有的錯誤碼,導致錯誤提示不倫不類;另外一些開發人員則傾向于定義大量的錯誤碼,幾乎每處異常都定義一個新錯誤碼(理由是每處異常文字提示都不一樣),最終導致錯誤碼失控。

“錯誤碼”們的改進

改進其實很簡單,就是允許異常類傳入自定義描述:

// 增加了可選參數 message,允許傳入自定義描述
class MyException(code, message = '') {
    ...
}

期望程序中有如下調用:

if (balance < amount) {
    throw new MyException(NOT_ENOUGH, '卡余額不足,當前可用余額' + balance)
}

但你會驚奇地發現,大部分地方仍舊是這樣調的:

if (balance < amount) {
    throw new MyException(NOT_ENOUGH)
}

“錯誤碼”們忽略了很重要的心理學上的問題。

人都是有惰性的,如果你提供了偷懶的途徑,他沒有理由不偷懶。

反“錯誤碼”們:追求自由

和“系統異常”們以及“錯誤碼”們力求嚴格限制系統輸出不同,“自由派”追求極致的自由,code 和 message 都不用約束,開發人員想怎么寫就怎么寫。

所以你可能在多個地方看到“卡余額不足”的錯誤,但每個的錯誤碼都不同(可能是不同的人寫的,也可能是同一個開發人員在不同時期寫的,甚至是同一個人在同一天寫的,寫的時候完全看心情)。

自由派的做法對于錯誤提示是有好處的,開發人員可以盡情地定制個性化的提示內容,當系統出現異常時能根據現場提示很快定位錯誤所在。不過由于錯誤碼是隨性寫的,對于依賴錯誤碼的調用方(系統)并不友好。一些系統需要依據 API 返回的錯誤碼做一些特殊邏輯處理,當調用方認為 405 表示余額不足,然而過幾天又來個 503 的余額不足時,調用方程序員的內心肯定是崩潰的。

中庸之道

本人的異常處理原則是:強制固定 code、自定義 message。

要想設計出“人猿共歡”的異常處理機制,必須先搞清楚誰需要用到這些信息。

異常信息的第一使用者是人,這里包括使用者(用戶)和異常處理者(運營人員、程序員)。

細分一下,異常又分為業務異常和系統 bug。

業務異常是指業務流程中的異常場景,如支付時卡余額不足導致無法支付、用券時發現券不符合使用條件、用戶執行了某個未授權的操作等。這類異常的觸發者是用戶自己(而不是系統),信息受眾是用戶。所以業務異常的信息提示必須注重用戶體驗,優秀的提示文字至少要做到以下幾點:

  1. 尊重用戶,不要讓用戶感覺受到冒犯或戲謔(請慎用自認為很“幽默”的話語);
  2. 清晰,應包含觸發異常的關鍵信息(如當余額不足時應提示當前余額是多少);
  3. 具備指引性,用戶看了之后清楚該怎么做;

第二類異常是系統 bug,如接口超時、非預期參數導致程序崩潰、代碼邏輯 bug 等。該類異常的觸發者是系統(或者說開發系統的程序員),信息受眾是程序員。所以 bug 類型異常的信息提示必須對程序員友好,讓程序員看到錯誤提示后能夠快速定位到問題的原因、代碼所在的位置。

我們說異常,一般就是指 bug 型異常,這類異常占程序員的精力也是最多的,也最值得優化處理機制。

bug 型異常具有如下特征:

  1. 不可控性。沒有程序員會主動去寫 bug,但沒有哪個系統完全沒有 bug。我們無法預知 bug 到底來自哪里、會有什么樣的提示信息;
  2. 定位困難。當系統提示“余額不足”時,我們很快知道是用戶卡沒錢了,但當系統提示“參數類型錯誤”時,我們往往只能一臉懵逼;
  3. 可能涉及敏感信息。如 SQL 操作錯誤時可能會將整個 SQL 語句暴露給外界;

因而優秀的 bug 型異常處理機制應做到:

  1. 提示信息對程序員友好;
  2. 記錄函數調用棧信息;
  3. 脫敏;

提示信息對程序員友好,可能意味著對用戶并不友好,一些程序員正是據此以“用戶體驗”之名將 bug 提示信息轉換成了“對用戶友好”的提示文案,結果是所有人看了都云里霧里。

我的觀點是:bug 型異常壓根不用考慮用戶體驗。

為啥?

因為系統出 bug 本身已經是非常糟糕的用戶體驗了,用戶不會因諸如“哎呀,系統開小差了”之類的廢話就變得好受些,用戶真正關心的是盡快能正常下單。

此時的當務之急是快速修復 bug,所以提示文案的定位功能就非常重要,一段純技術性的文字,對于用戶來說可能是天書,但對于程序員很實用。

然而,這不意味著給到用戶端的錯誤提示就可以為所欲為。如果我們為了方便定位便將整個程序調用棧 alert 出來,雖然可能并不會進一步拉低用戶體驗,但至少給人的感覺是不專業,而且過多的信息也意味著很容易暴露敏感信息(如程序路徑、軟件版本、SQL 語句),如果對方是個黑客,你只能自祈多福了。

另外要注重脫敏。大部分框架在數據庫操作失敗時,其 message 信息中都會包含諸如 SQL 語句之類的敏感信息,這類信息不可暴露到外面。

綜上,我們可以采取文案+日志的策略,文案中包含關鍵信息,日志中包含詳細信息(包括調用棧信息)。

大部分的 DB 庫拋出的異常都有共同基類(如 DBException),我們可以針對這類異常做脫敏處理。

這也告訴我們另一件事:當我們自己開發公共庫時,最好為該庫定義一個統一基類異常,這樣當使用者想要特殊處理該庫拋出的所有異常時不至于狗咬刺猬無處下牙了。

另外,有些團隊并不想記錄業務型異常的調用棧信息(“卡余額不足”時,調用棧信息并無多大意義)。我們可以在框架層面定義個業務異常基類:BusinessException,異常處理時不記錄該類型的調用棧信息。

異常信息的另一個使用者是系統。包括其他服務、前端 js 腳本等。

我見過類似這樣的代碼:

try {
    ...
} catch (e) {
    switch (e.message) {
        case'用戶不存在':
            ...
        case ...
    }
}

如果某個后端程序員哪天心血來潮將“用戶不存在”改成“用戶信息不存在”,系統就崩了。

寫出如此脆弱系統的程序員應該被釘到 1024 號恥辱柱上!

不過,在釘釘子之前,我們應該傾聽一下他那痛苦的心聲:接口返回的錯誤碼實在是雜亂無章,光“用戶不存在”的錯誤碼就有八個,說不定未來還會增加。為“系統穩定性”考慮,最終選擇匹配 message。

好吧,應該將后端程序員一起釘上去!

系統只會,也只應該關注錯誤碼。所以和 message 的隨意性不同,code 應具備相當的穩定性。

同一個系統,如果 406 表示“用戶不存在”,就絕不應該再用其他值(如 604)表示相同的含義。

另外,“code 面向系統”這一特點也要求 code 定義的是某一類異常(而不是某一個異常)。例如“訂單創建失敗”是一類異常,在業務代碼中針對不同的失敗原因有不同的 message,但其 code 都是一樣的。

然而人類對數字并不敏感,要不同的程序員都保證寫 throw new Exception('用戶不存在', 406)(而不是寫throw new Exception('用戶不存在', 604))是不可能的。

所以需要將數字文本化,也就是定義錯誤碼常量:

const USER_NOT_EXISTS = 406

代碼中只能使用錯誤碼常量:

throw new Exception('用戶不存在', USER_NOT_EXISTS)

禁止使用字面量。

不過上面這段 throw 并不理想,首先默認類型 Exception 并不具備業務語義,另外開發人員如果硬是用數字字面量誰也沒辦法。更可取的方式是針對每種類型異常定義單獨的異常類,該異常類僅允許傳入 message,類內部自行綁定 code:

// 用戶不存在
class UserNotExistsException extends Exception { 
    constructor(message) {
        super(message)
        
        this.code = ErrCode.USER_NOT_EXISTS
    }
}

使用:

if (!User.find(uid)) {
    // 此寫法更具表達性,而且開發人員無需關注錯誤碼
    throw new UserNotExistsException(`用戶不存在(uid:${uid})`)
}

異常捕獲機制代碼示例

先總結一下中庸主義的異常捕獲機制特點:

  1. 強制開發人員自己編寫異常描述文案;
  2. 整個項目強制使用統一的錯誤碼定義;
  3. 為業務型異常定義單獨的基類;
  4. 關鍵信息脫敏處理;

統一錯誤碼定義:

const OK = 200
const SYS_ERR = 500
const NOT_FOUND = 404
const NOT_ENOUGH = 405
const USER_NOT_EXISTS = 406
...

業務異常基類:

class BussinessException extends Exception {
    ...
}

異常類定義:

class UserNotExistsException extends BussinessException {
    constructor(message) {
        super(message)
        
        this.code = ErrCode.USER_NOT_EXISTS
    }
}

...

業務層使用:

...
if (!User.find(uid)) {
    throw new UserNotExistsException(`用戶不存在(uid:${uid})`)
}
...

控制器基類捕獲異常

class BaseController {
    ...
    
    errorHandler(err) {
        // 是否業務型異常
        const isBussError = err instanceof BussinessException
        // 是否數據庫異常
        const isDBError = err instanceof DBException
        // 生成用于跟蹤異常日志的隨機串
        const flag = isBussError ? '' : random()
        
        let message = err.message
        if (isDBError) {
            // 數據庫異常,脫敏
            message = `數據異常(flag:${flag})`
        } elseif (!isBussError) {
            // 非業務型異常記錄 flag 標識
            message += `(flag:${flag})`
        }
        
        // 記錄日志(日志要記錄原始的 message)
        log(err.message, isBussError ? '' : err.stackTrace(), flag)
        
        // 返回給調用端
        this.response.sendJSON({"code": err.code, "message": message})
    }
    
    function log(message, stackTrace, flag) {
        ...
    }
    ...
}

基于約定的異常處理機制

即便框架層提供了完善的異常處理機制,你還是無法阻止開發人員寫這樣的代碼:

if (!User.find(uid)) {
    throw new Exception(’系統異常‘, 500)
}

一行代碼就給你打回原形!

所以異常處理機制是基于約定的(團隊公約)。

責任編輯:武曉燕 來源: 編碼胡同
相關推薦

2024-06-11 00:00:01

系統技術代碼

2025-10-26 14:50:25

AI人工智能ChatGPT

2011-10-25 09:24:08

2018-02-23 09:55:12

程序員壓迫Python

2025-01-22 07:00:00

C++11構造函數C++

2023-08-29 06:50:01

Javamaven

2015-08-10 10:26:08

2025-10-27 08:46:00

2011-11-08 11:22:35

技術周刊

2020-05-22 15:16:45

遠程工作辦公互聯網

2013-03-08 09:54:25

2021-07-01 05:17:52

Windows 11操作系統微軟

2014-03-06 09:23:19

Git服務器Github

2012-11-12 12:03:26

臺式機Mac聯想

2020-07-06 14:40:28

攜號轉網運營商服務

2021-03-03 14:55:10

開發MySQL代碼

2021-03-19 08:54:02

芯片Morpheus漏洞

2025-10-11 01:22:00

2012-05-04 13:09:46

IBM大型機云計算

2015-11-16 09:04:19

寫代碼程序員年齡
點贊
收藏

51CTO技術棧公眾號

亚洲欧洲免费视频| 精品久久久久久久久久久久久| 91久久精品久久国产性色也91| 日本少妇高清视频| 国产成人aa在线观看网站站| 疯狂做受xxxx高潮欧美日本| 亚欧精品在线| www.97超碰| 久久夜色精品| 欧美激情第一页xxx| 亚洲区免费视频| 国产精区一区二区| 欧美日韩色婷婷| 自拍偷拍视频在线| 日韩av成人| 国产一区二区看久久| 欧美在线视频免费观看| 国产免费一区二区三区四区| 色先锋久久影院av| 日韩一级免费观看| 熟女少妇精品一区二区| 爱情岛论坛亚洲品质自拍视频网站| 久久综合久久鬼色中文字| 91丝袜美腿美女视频网站| 亚洲色在线视频| 麻豆亚洲一区| www.狠狠干| 久久99精品国产91久久来源| 欧美一区二区三区艳史| 久艹视频在线观看| 四虎成人精品永久免费av九九| 亚洲国产成人精品久久| 97人人模人人爽人人澡| 精品裸体bbb| 亚洲欧洲韩国日本视频| 欧美裸体网站| 色欲久久久天天天综合网| 国产一级精品在线| 91精品国产综合久久男男| 久久永久免费视频| 亚洲在线日韩| 97国产在线观看| 欧美另类视频在线观看| 欧美成人嫩草网站| 日韩视频在线免费| 精品伦精品一区二区三区视频密桃| 免费av一区二区三区四区| 欧美成人aa大片| 日本黄色www| 国产精品一区二区三区av| 欧美日韩国产大片| 一本色道久久亚洲综合精品蜜桃| 国产精品亚洲一区二区三区在线观看| 婷婷成人综合网| 日韩视频在线视频| 免费看男女www网站入口在线 | 在线中文字幕第一页| 综合亚洲深深色噜噜狠狠网站| 最新欧美日韩亚洲| 理论片午午伦夜理片在线播放| 国产精品人妖ts系列视频| 日韩中文一区二区三区| av国产在线观看| 中文字幕在线不卡一区二区三区| 在线观看欧美激情| av理论在线观看| 亚洲一二三级电影| 欧美一区二区三区爽大粗免费| 中国女人特级毛片| 欧美午夜黄色| 国产亚洲女人久久久久毛片| 五月婷婷综合色| 日本中文字幕在线视频| 亚洲视频图片小说| 成人在线播放网址| 深夜成人在线| 欧美日韩一区小说| 久久久国产精品久久久| 欧亚精品一区| 亚洲日本成人女熟在线观看| 久久成人小视频| 激情欧美日韩| 日韩美女福利视频| 91中文字幕在线播放| 国产大片一区二区| 免费成人在线观看av| 视频免费一区| 亚洲国产精品人人做人人爽| 国产第一页视频| 啪啪av大全导航福利综合导航| 日韩精品一区二| 久操视频免费看| 欧美欧美全黄| 日韩av大片免费看| 国产xxxx在线观看| 久久亚洲精华国产精华液| 中文字幕中文字幕在线中一区高清| 青春草在线免费视频| 色婷婷狠狠综合| 69久久精品无码一区二区| 四虎5151久久欧美毛片| 久久亚洲精品视频| av大全在线观看| 国产一区欧美二区| 美日韩精品免费| 日本aa在线| 欧洲视频一区二区| 亚洲欧美高清在线| 久久中文字幕二区| 欧美一区三区三区高中清蜜桃| 一级aaaa毛片| 久久久亚洲午夜电影| 伊人再见免费在线观看高清版| 欧美一级大黄| 亚洲成**性毛茸茸| 九九热最新地址| 日本欧美一区二区在线观看| 国产精品免费一区二区三区观看 | 色阁综合伊人av| 不卡的免费av| 国产精品888| 午夜精品视频在线观看一区二区 | 伊人久久大香线蕉综合四虎小说 | 日韩中文在线字幕| 欧美日韩不卡| 亚洲精品美女免费| 免费无遮挡无码永久在线观看视频| 天堂影院一区二区| 久久久久成人精品免费播放动漫| a在线免费观看| 欧美色综合影院| 欧美日韩高清丝袜| 国产欧美综合一区二区三区| 91国产在线播放| 午夜小视频在线| 欧美影院精品一区| 在线免费观看黄色小视频| 激情综合自拍| 成人av免费电影| 中文在线字幕免费观看| 欧美日韩国产一二三| 免费看裸体网站| 久久久久久色| 日本在线观看一区| 久久爱91午夜羞羞| 亚洲欧美在线看| 三级网站在线播放| 久久久www免费人成精品| 国产精品一区二区免费在线观看| 国产精品中文字幕制服诱惑| 欧美激情在线观看| 隣の若妻さん波多野结衣| 亚洲最大的成人av| 911亚洲精选| 亚洲网址在线| 精品久久精品久久| 在线观看福利电影| 亚洲欧美在线免费观看| 波多野结衣网站| 欧美国产日韩精品免费观看| 成人黄色一区二区| 欧美顶级大胆免费视频| 91欧美激情另类亚洲| a视频在线播放| 欧美不卡在线视频| 久久久天堂国产精品| 日本高清不卡码| 久久久精品黄色| 中文字幕永久视频| 欧美电影《轻佻寡妇》| 亚洲bt天天射| heyzo中文字幕在线| 日韩电影中文字幕一区| 日本中文字幕在线观看视频| 国产精品区一区二区三| 伊人免费视频二| 影音先锋在线一区| 欧美日韩亚洲在线| 欧美亚洲福利| 色在人av网站天堂精品| 色吊丝在线永久观看最新版本| 91国偷自产一区二区三区观看| 国产一二三四区在线| 国产精品夜夜爽| 无码人妻h动漫| 天天操夜夜操国产精品| 国产福利不卡| 日韩中文在线播放| 欧美理论片在线观看| 色视频免费在线观看| 欧美日韩免费一区二区三区视频| 欧美日韩一级大片| 国产亚洲欧美色| 国产精品二区视频| 天堂va蜜桃一区二区三区漫画版| 先锋影音男人资源| 米奇777超碰欧美日韩亚洲| 成人女保姆的销魂服务| 国产激情在线播放| 久久综合免费视频| 亚洲AV第二区国产精品| 91精品国产综合久久精品性色| 国产精品999久久久| 日韩一区日韩二区| 熟女少妇一区二区三区| 国产乱码字幕精品高清av| 久久综合久久色| 精品动漫av| 中文字幕剧情在线观看一区| 色婷婷狠狠五月综合天色拍 | av老司机久久| 日本福利一区二区| 日韩免费不卡视频| 亚洲三级电影全部在线观看高清| 久久久久麻豆v国产精华液好用吗| 久久国产综合精品| 国产免费一区二区三区视频| 91超碰国产精品| 日韩精品极品视频在线观看免费| 台湾佬中文在线| 国产成人免费av在线| 天堂av在线网站| 久久精品国产清高在天天线| 久操网在线观看| 亚洲五月综合| 一区二区三区观看| 日韩精品诱惑一区?区三区| 鲁鲁狠狠狠7777一区二区| 视频一区在线| 51精品国产人成在线观看| 国语自产精品视频在线看抢先版结局 | 欧美性潮喷xxxxx免费视频看| 日韩欧美视频| 日本在线成人一区二区| 久草在线成人| 蜜桃成人免费视频| 神马香蕉久久| 欧美裸体网站| 国产在线日韩精品| 日本免费一区二区三区| 久久综合影院| 日本一区网站| 成久久久网站| 亚洲精品欧洲精品| 成人三级视频| 五月婷婷综合色| 日韩在线视频精品| 在线看无码的免费网站| 91欧美在线| 在线不卡日本| 亚洲字幕久久| 日本a在线天堂| 欧美69视频| 999一区二区三区| 一区二区三区导航| 男人天堂网视频| 日本女人一区二区三区| 天天干天天爽天天射| 麻豆精品国产传媒mv男同| 91 在线视频观看| 国产一区二区三区免费播放| gogo亚洲国模私拍人体| 国精产品一区一区三区mba视频| 涩多多在线观看| 国产成人免费av在线| 国产不卡一二三| 久久亚洲一区二区三区四区| 69精品无码成人久久久久久| 国产精品乱人伦中文| 暗呦丨小u女国产精品| 亚洲国产精品久久艾草纯爱| 日韩精品在线不卡| 欧美在线观看视频在线| 国产又大又粗又长| 亚洲高清不卡av| 国产剧情在线观看| 久久亚洲精品视频| 天堂av在线| 国产精品丝袜视频| 99久久免费精品国产72精品九九| 久久国产欧美精品| 色综合狠狠操| 中文字幕无码精品亚洲资源网久久| 中文高清一区| 色婷婷综合网站| 成人免费不卡视频| 亚洲女优在线观看| 一区二区三区在线观看网站| 日本中文在线播放| 欧美成人milf| 亚洲xxxxx性| 日本欧美韩国国产| 在线视频欧美一区| 一区二区三区四区五区精品视频| 91看片在线免费观看| 成a人片国产精品| 日本 欧美 国产| 午夜精品免费在线| 91一区二区视频| 亚洲精品日韩欧美| 国产在线更新| 国产ts人妖一区二区三区| 超碰国产精品一区二页| 久久精品丝袜高跟鞋| 亚洲字幕久久| 国产xxxxx视频| 不卡的av在线播放| www.xxxx日本| 日本国产一区二区| 蜜桃91麻豆精品一二三区| 正在播放国产一区| 久九九久频精品短视频| 国产伦理一区二区三区| 99久久这里只有精品| 成年人视频观看| 成人午夜视频免费看| 成人在线观看免费完整| 欧美性受xxxx黑人xyx性爽| 天天操天天干天天爽| 欧美精品一本久久男人的天堂| 99re久久| 色一情一乱一伦一区二区三区| 亚洲茄子视频| 国产调教打屁股xxxx网站| 亚洲天堂福利av| 中文字幕一区二区免费| 亚洲色图国产精品| 538在线视频| 福利视频久久| 国产精品av一区二区| 99中文字幕在线| 亚洲欧洲www| 国产又粗又大又爽视频| 伊人男人综合视频网| 欧美日韩不卡| 少妇精品久久久久久久久久| 丝袜脚交一区二区| 国产ts在线播放| 色综合网站在线| 欧美在线观看在线观看| 欧美在线视频网站| 五月激激激综合网色播| 国产极品在线视频| 91亚洲精华国产精华精华液| 国产污视频在线看| 亚洲第一网站免费视频| 国产理论在线| 久久大片网站| 视频精品一区二区| 精品无码在线观看| 欧美另类久久久品| 久操视频在线观看| 亚洲自拍小视频| 黄色成人91| www.日本高清| 色婷婷久久久久swag精品| 福利小视频在线观看| 国产精品亚洲第一区| 99精品美女| 丰满少妇中文字幕| 亚洲va在线va天堂| 亚洲人午夜射精精品日韩| 日韩av免费在线看| 国产精品毛片久久| 久久久久亚洲av无码专区首jn| 亚洲第一成人在线| 日韩精品视频在线观看一区二区三区| 国产成人激情视频| 日韩中文字幕高清在线观看| 成人免费黄色av| 午夜久久福利影院| 欧美黄色小说| 国产一区二区在线免费| 欧美不卡高清| 深爱五月激情网| 欧美乱妇20p| 狠狠操一区二区三区| 视频一区视频二区视频三区视频四区国产 | 欧美大秀在线观看| 国产精品调教视频| 九九热在线免费| 一区二区三区国产豹纹内裤在线 | 日韩精品一级| 欧美亚洲精品一区二区| 中文字幕第一区| 亚洲黄色在线观看视频| 国产成人亚洲综合91精品| 91九色精品| 亚洲熟妇一区二区三区| 777奇米四色成人影色区| rebdb初裸写真在线观看| 一区二区三区偷拍| 成人少妇影院yyyy| 亚洲系列在线观看| 91精品国产高清久久久久久91 | 中文字幕欧美在线观看| 欧美肥婆姓交大片| 精品日韩免费| 一区二区三区四区影院| 欧美综合亚洲图片综合区|