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

WinForm中使用NLog實現全局異常處理:完整指南

開發 前端
實現全局異常處理不僅能提高應用程序的穩定性和可維護性,還能為用戶提供更好的使用體驗。在實際項目中,可以根據具體需求對本文提供的示例進行擴展和定制。

為什么需要全局異常處理?

在開發WinForm桌面應用程序時,異常處理是確保應用穩定性的關鍵環節。未處理的異常不僅會導致程序崩潰,還會造成用戶體驗下降和數據丟失。全局異常處理機制可以:

  • 防止應用程序意外崩潰
  • 記錄異常信息,便于問題定位和修復
  • 向用戶提供友好的錯誤提示
  • 收集軟件運行狀態數據,輔助產品改進

NLog作為.NET生態中的優秀日志框架,具有配置靈活、性能優異、擴展性強等特點,是實現全局異常處理的理想工具。

環境準備

創建WinForm項目

首先,創建一個新的WinForm應用程序項目。

安裝NLog包

通過NuGet包管理器安裝NLog:

Install-Package NLog

或在Visual Studio中右鍵項目 -> 管理NuGet包 -> 搜索并安裝上述包。

三、配置NLog

基礎配置

項目中添加NLog.config文件。我們可以根據需求修改配置:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off">

<!-- 定義日志輸出目標 -->
<targets>
    <!-- 文件日志,按日期滾動 -->
    <target xsi:type="File" name="file" 
            fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${exception:format=tostring}" 
            archiveFileName="${basedir}/logs/archives/{#}.log"
            archiveNumbering="Date"
            archiveEvery="Day"
            archiveDateFormat="yyyy-MM-dd"
            maxArchiveFiles="30" />

    <!-- 錯誤日志單獨存儲 -->
    <target xsi:type="File" name="errorfile" 
            fileName="${basedir}/logs/errors/${shortdate}.log"
            layout="${longdate} | ${level:uppercase=true} | ${logger} | ${message} ${exception:format=tostring}" />
</targets>

<!-- 定義日志規則 -->
<rules>
    <!-- 所有日志 -->
    <logger name="*" minlevel="Info" writeTo="file" />
    <!-- 僅錯誤日志 -->
    <logger name="*" minlevel="Error" writeTo="errorfile" />
</rules>
</nlog>

圖片圖片

自定義配置(可選)

根據項目需求,你可以添加更多的輸出目標,如:

  • 數據庫日志
  • 郵件通知
  • Windows事件日志
  • 網絡日志等

實現全局異常處理

創建Logger工具類

首先,創建一個Logger工具類,封裝NLog的使用:

using NLog;
using System;

namespace WinFormNLogDemo
{
    publicstaticclass LogHelper
    {
        // 創建NLog實例
        privatestatic readonly Logger logger = LogManager.GetCurrentClassLogger();

        /// <summary>
        /// 記錄信息日志
        /// </summary>
        /// <param name="message">日志消息</param>
        public static void Info(string message)
        {
            logger.Info(message);
        }

        /// <summary>
        /// 記錄警告日志
        /// </summary>
        /// <param name="message">警告消息</param>
        public static void Warn(string message)
        {
            logger.Warn(message);
        }

        /// <summary>
        /// 記錄錯誤日志
        /// </summary>
        /// <param name="ex">異常對象</param>
        /// <param name="message">附加消息</param>
        public static void Error(Exception ex, string message = "")
        {
            if (string.IsNullOrEmpty(message))
            {
                logger.Error(ex);
            }
            else
            {
                logger.Error(ex, message);
            }
        }

        /// <summary>
        /// 記錄致命錯誤日志
        /// </summary>
        /// <param name="ex">異常對象</param>
        /// <param name="message">附加消息</param>
        public static void Fatal(Exception ex, string message = "")
        {
            if (string.IsNullOrEmpty(message))
            {
                logger.Fatal(ex);
            }
            else
            {
                logger.Fatal(ex, message);
            }
        }
    }
}

全局異常處理器

接下來,在Program.cs中添加全局異常捕獲代碼:

namespace AppNLog
{
    internal staticclass Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            // To customize application configuration such as set high DPI settings or default font,
            // see https://aka.ms/applicationconfiguration.
            ApplicationConfiguration.Initialize();
            // 設置應用程序異常處理
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            // 處理UI線程異常
            Application.ThreadException += Application_ThreadException;
            // 處理非UI線程異常
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            // 啟動應用程序
            LogHelper.Info("應用程序啟動");
            Application.Run(new Form1());
        }

        /// <summary>
        /// 處理UI線程異常
        /// </summary>
        private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            try
            {
                // 記錄異常日志
                LogHelper.Error(e.Exception, "UI線程異常");

                // 向用戶顯示友好錯誤消息
                MessageBox.Show(
                    "程序遇到了一個問題,已記錄異常信息。\n\n" +
                    "錯誤信息: " + e.Exception.Message,
                    "應用程序錯誤",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                try
                {
                    LogHelper.Fatal(ex, "處理UI線程異常時發生錯誤");
                }
                catch
                {
                    // 如果日志記錄也失敗,使用消息框作為最后手段
                    MessageBox.Show("無法記錄異常信息: " + ex.Message, "嚴重錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        /// <summary>
        /// 處理非UI線程異常
        /// </summary>
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                Exception ex = e.ExceptionObject as Exception;

                // 記錄異常日志
                if (ex != null)
                {
                    LogHelper.Fatal(ex, "非UI線程異常");
                }
                else
                {
                    LogHelper.Fatal(new Exception("未知異常類型"),
                        "發生未知類型的非UI線程異常: " + e.ExceptionObject.ToString());
                }

                // 如果異常導致應用程序終止,記錄這一信息
                if (e.IsTerminating)
                {
                    LogHelper.Fatal(new Exception("應用程序即將終止"), "由于未處理的異常,應用程序即將關閉");

                    MessageBox.Show(
                        "程序遇到了一個嚴重問題,必須關閉。\n請聯系技術支持獲取幫助。",
                        "應用程序即將關閉",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                try
                {
                    LogHelper.Fatal(ex, "處理非UI線程異常時發生錯誤");
                }
                catch
                {
                    // 如果日志記錄也失敗,使用消息框作為最后手段
                    MessageBox.Show("無法記錄異常信息: " + ex.Message, "嚴重錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
    }
}

在界面添加測試按鈕

接下來,在MainForm中添加幾個按鈕,用于測試不同類型的異常:

namespace AppNLog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 測試UI線程異常
        /// </summary>
        private void btnTestUIException_Click(object sender, EventArgs e)
        {
            LogHelper.Info("準備測試UI線程異常");

            // 故意制造一個異常
            string str = null;
            int length = str.Length; // 這里會引發NullReferenceException
        }

        /// <summary>
        /// 測試非UI線程異常
        /// </summary>
        private void btnTestNonUIException_Click(object sender, EventArgs e)
        {
            LogHelper.Info("準備測試非UI線程異常");

            // 在新線程中拋出異常
            Task.Run(() =>
            {
                // 故意制造一個異常
                int[] numbers = newint[5];
                int value = numbers[10]; // 這里會引發IndexOutOfRangeException
            });
        }

        /// <summary>
        /// 測試文件操作異常
        /// </summary>
        private void btnTestFileException_Click(object sender, EventArgs e)
        {
            LogHelper.Info("準備測試文件操作異常");

            try
            {
                // 嘗試讀取一個不存在的文件
                string content = File.ReadAllText("非存在文件.txt");
            }
            catch (Exception ex)
            {
                // 局部異常處理示例
                LogHelper.Error(ex, "文件操作失敗");
                MessageBox.Show("無法讀取文件,詳情請查看日志。", "文件錯誤", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        /// <summary>
        /// 記錄普通日志
        /// </summary>
        private void btnLogInfo_Click(object sender, EventArgs e)
        {
            LogHelper.Info("這是一條信息日志,記錄于: " + DateTime.Now.ToString());
            MessageBox.Show("日志已記錄", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

圖片圖片

圖片圖片

高級功能實現

異常信息擴展

為了更好地記錄異常發生時的上下文環境,我們可以擴展異常信息:

using NLog;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;

namespace WinFormNLogDemo
{
    publicstaticclass ExceptionExtensions
    {
        /// <summary>
        /// 獲取詳細的異常信息,包括內部異常、堆棧跟蹤等
        /// </summary>
        public static string GetDetailedErrorMessage(this Exception ex)
        {
            if (ex == null) returnstring.Empty;

            StringBuilder sb = new StringBuilder();
            sb.AppendLine("========== 異常詳細信息 ==========");
            sb.AppendLine($"發生時間: {DateTime.Now}");
            sb.AppendLine($"異常類型: {ex.GetType().FullName}");
            sb.AppendLine($"異常消息: {ex.Message}");

            // 獲取應用程序版本信息
            sb.AppendLine($"應用版本: {Assembly.GetExecutingAssembly().GetName().Version}");

            // 記錄操作系統信息
            sb.AppendLine($"操作系統: {Environment.OSVersion}");
            sb.AppendLine($".NET版本: {Environment.Version}");

            // 堆棧跟蹤
            if (!string.IsNullOrEmpty(ex.StackTrace))
            {
                sb.AppendLine("堆棧跟蹤:");
                sb.AppendLine(ex.StackTrace);
            }

            // 內部異常
            if (ex.InnerException != null)
            {
                sb.AppendLine("內部異常:");
                sb.AppendLine(GetInnerExceptionDetails(ex.InnerException));
            }

            sb.AppendLine("===================================");

            return sb.ToString();
        }

        /// <summary>
        /// 遞歸獲取內部異常信息
        /// </summary>
        private static string GetInnerExceptionDetails(Exception exception, int level = 1)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine($"[內部異常級別 {level}]");
            sb.AppendLine($"類型: {exception.GetType().FullName}");
            sb.AppendLine($"消息: {exception.Message}");

            if (!string.IsNullOrEmpty(exception.StackTrace))
            {
                sb.AppendLine("堆棧跟蹤:");
                sb.AppendLine(exception.StackTrace);
            }

            if (exception.InnerException != null)
            {
                sb.AppendLine(GetInnerExceptionDetails(exception.InnerException, level + 1));
            }

            return sb.ToString();
        }
    }
}

然后,修改LogHelper類使用這個擴展方法:

/// <summary>
/// 記錄錯誤日志(增強版)
/// </summary>
public static void ErrorDetailed(Exception ex, string message = "")
{
    string detailedMessage = ex.GetDetailedErrorMessage();

    if (string.IsNullOrEmpty(message))
    {
        logger.Error(detailedMessage);
    }
    else
    {
        logger.Error($"{message}\n{detailedMessage}");
    }
}

圖片圖片

日志查看器集成

為了方便在應用程序內部查看日志,可以添加一個簡單的日志查看器:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AppNLog
{
    public partial class FrmLogViewer : Form
    {
        privatestring logDirectory;
        public FrmLogViewer()
        {
            InitializeComponent();
            logDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs");

        }

        /// <summary>
        /// 加載日志文件列表
        /// </summary>
        private void LoadLogFiles()
        {
            try
            {
                listBoxLogFiles.Items.Clear();

                if (!Directory.Exists(logDirectory))
                {
                    MessageBox.Show("日志目錄不存在", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                string[] logFiles = Directory.GetFiles(logDirectory, "*.log");
                foreach (string file in logFiles)
                {
                    listBoxLogFiles.Items.Add(Path.GetFileName(file));
                }

                // 加載錯誤日志
                string errorDirectory = Path.Combine(logDirectory, "errors");
                if (Directory.Exists(errorDirectory))
                {
                    string[] errorFiles = Directory.GetFiles(errorDirectory, "*.log");
                    foreach (string file in errorFiles)
                    {
                        listBoxLogFiles.Items.Add("錯誤/" + Path.GetFileName(file));
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex, "加載日志文件列表時出錯");
                MessageBox.Show("無法加載日志文件列表: " + ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 選擇日志文件
        /// </summary>
        private void listBoxLogFiles_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (listBoxLogFiles.SelectedItem == null) return;

                string selectedFile = listBoxLogFiles.SelectedItem.ToString();
                string filePath;

                if (selectedFile.StartsWith("錯誤/"))
                {
                    filePath = Path.Combine(logDirectory, "errors", selectedFile.Substring(3));
                }
                else
                {
                    filePath = Path.Combine(logDirectory, selectedFile);
                }

                if (File.Exists(filePath))
                {
                    txtLogContent.Text = File.ReadAllText(filePath);
                }
                else
                {
                    txtLogContent.Text = "日志文件不存在或已被刪除";
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex, "讀取日志文件內容時出錯");
                txtLogContent.Text = "無法讀取日志文件: " + ex.Message;
            }
        }

        /// <summary>
        /// 刷新日志文件列表
        /// </summary>
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            LoadLogFiles();
        }

        /// <summary>
        /// 清空所選日志內容
        /// </summary>
        private void btnClear_Click(object sender, EventArgs e)
        {
            txtLogContent.Clear();
        }

        private void FrmLogViewer_Load(object sender, EventArgs e)
        {
            LoadLogFiles();
        }
    }
}

圖片圖片

應用程序退出時記錄日志

確保在應用程序退出時記錄相關信息:

// 在MainForm中添加
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    LogHelper.Info("應用程序正常關閉");
}

應用場景與最佳實踐

常見應用場景

全局異常處理在以下場景特別有用:

  1. 企業級應用需要高穩定性和可維護性
  2. 分布式部署的客戶端便于收集用戶端異常信息
  3. 數據處理應用確保數據處理過程中的異常被捕獲和記錄
  4. 長時間運行的應用提高應用程序的持續可用性

最佳實踐

  1. 分層記錄按照不同級別記錄日志(Debug, Info, Warning, Error, Fatal)
  2. 結構化日志使用結構化格式,便于后續分析
  3. 關聯信息記錄用戶ID、操作ID等關聯信息
  4. 定期清理設置日志輪轉和清理策略,避免磁盤空間占用過大
  5. 異常分析定期分析日志,發現并解決常見問題
  6. 性能考慮日志記錄操作應盡量異步化,避免影響主線程性能

常見問題與解決方案

日志文件權限問題

問題:應用程序沒有寫入日志目錄的權限。

解決方案

  1. 確保應用程序有寫入權限
  2. 使用User目錄下的路徑存儲日志
  3. 在安裝程序中正確設置權限
// 使用用戶目錄存儲日志
string logPath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
    "YourAppName",
    "logs"
);

// 確保目錄存在
if (!Directory.Exists(logPath))
{
    Directory.CreateDirectory(logPath);
}

日志內容過大

問題:日志文件增長過快,占用過多磁盤空間。

解決方案

  1. 使用日志分級策略,只記錄必要的信息
  2. 設置日志文件大小上限和輪轉策略
  3. 實現自動清理歷史日志的功能
<!-- NLog配置示例:限制文件大小和數量 -->
<target xsi:type="File" name="file" 
        fileName="${basedir}/logs/${shortdate}.log"
        archiveFileName="${basedir}/logs/archives/{#}.log"
        archiveNumbering="Date"
        archiveEvery="Day"
        archiveDateFormat="yyyy-MM-dd"
        maxArchiveFiles="30"
        archiveAboveSize="10485760" <!-- 10MB -->
        cnotallow="true"
        keepFileOpen="false" />

性能問題

問題:日志記錄影響應用程序性能。

解決方案

  1. 使用異步日志記錄
  2. 優化日志配置,減少I/O操作
  3. 批量寫入日志,而不是頻繁的單條寫入
<!-- NLog異步處理配置 -->
<targets async="true">
    <!-- 日志目標配置 -->
</targets>

總結

通過本文的介紹,我們學習了如何在WinForm應用程序中使用NLog實現全局異常處理,主要包括:

  1. NLog的安裝與配置
  2. 全局異常處理器的實現
  3. 自定義日志工具類
  4. 異常信息的擴展與增強
  5. 內置日志查看器的實現
  6. 應用場景與最佳實踐

實現全局異常處理不僅能提高應用程序的穩定性和可維護性,還能為用戶提供更好的使用體驗。在實際項目中,可以根據具體需求對本文提供的示例進行擴展和定制。

責任編輯:武曉燕 來源: 技術老小子
相關推薦

2022-03-04 08:31:07

Spring異常處理

2025-09-12 09:31:29

2025-02-17 00:25:00

Winform開發

2023-12-27 07:53:08

全局異常處理處理應用

2009-02-06 14:11:36

ASP.NET.NET全局異常處理

2022-11-16 08:41:43

2017-08-10 10:28:43

SpringBootSpring

2021-01-04 05:44:54

框架日志

2019-01-24 16:11:19

前端全局異常數據校驗

2009-12-25 10:01:23

WinForm程序

2019-02-22 08:25:19

數據清洗預處理機器學習

2024-11-29 07:45:38

C#離線語音文字

2021-04-20 10:50:38

Spring Boot代碼Java

2023-12-26 08:00:00

微前端React

2009-04-28 09:51:21

WinForm控制臺輸出

2020-03-16 17:20:02

異常處理Spring Boot

2024-01-03 16:01:23

2024-05-15 15:27:39

2024-03-26 09:25:35

RustSerde重命名

2023-12-13 13:28:00

Spring全局異常處理架構
點贊
收藏

51CTO技術棧公眾號

99a精品视频在线观看| v天堂福利视频在线观看| 久久性色av| 日韩日本欧美亚洲| 自拍一级黄色片| 国产福利电影在线播放| 亚洲国产高清不卡| 国产精品入口免费| 久久久久精彩视频| 在线成人www免费观看视频| 国产一区二区三区在线视频 | 国产精品一卡二卡| 日本在线精品视频| 国产亚洲精品久久久久久无几年桃| 免费视频国产一区| 欧美成人a视频| 亚洲综合欧美激情| 亚洲色图官网| 亚洲精品欧美激情| 午夜精品短视频| 神马午夜在线观看| 国产一本一道久久香蕉| 国产高清视频一区三区| 粉嫩aⅴ一区二区三区| 欧美xxxxx视频| 亚洲欧洲视频在线| 亚洲一级av无码毛片精品| www久久久| 欧美性猛交xxxxxx富婆| 国模吧无码一区二区三区| 青青草视频在线免费直播| 国产精品人妖ts系列视频| 精品一区二区国产| 亚洲国产精品欧美久久| 韩国av一区二区三区四区| 国产成人拍精品视频午夜网站| 国产第100页| 欧美三级第一页| 欧美成人午夜视频| 极品色av影院| 99国内精品久久久久久久| 亚洲一区二区久久| 国产一二三四五区| 欧美女优在线视频| 精品亚洲男同gayvideo网站| 国产亚洲色婷婷久久99精品91| 中文字幕区一区二区三| 欧美一级高清片| 91大神免费观看| 国产精品毛片aⅴ一区二区三区| 欧美色电影在线| 日韩精品你懂的| 外国电影一区二区| 欧美日韩一二三| 国产精品久久久毛片| 亚洲电影有码| 欧美色爱综合网| 黄色小视频免费网站| 国产香蕉久久| 91精品国产手机| 天天操精品视频| 蜜桃在线一区| 亚洲福利影片在线| 亚洲天堂美女视频| 一本色道久久综合亚洲精品酒店| 精品香蕉一区二区三区| 日韩人妻无码精品综合区| 国产精品片aa在线观看| 中文字幕亚洲自拍| 国产又粗又硬又长又爽| 欧美日韩在线大尺度| 4438全国亚洲精品在线观看视频| 一级黄色大片视频| 免费高清在线视频一区·| 成人高清视频观看www| 国内老熟妇对白hdxxxx| www..com久久爱| 欧美一区免费视频| 欧美高清视频| 亚洲成人久久影院| 成人3d动漫一区二区三区| 日韩电影精品| 欧美精品一区二区三区在线| 美国黄色a级片| 91一区二区三区四区| 欧美精品久久久久久久久| 99热在线观看免费精品| 日本午夜一区二区| 亚洲伊人第一页| 牛牛影视精品影视| 亚洲欧美日韩系列| 欧美a在线视频| 日韩福利在线观看| 亚洲精品av在线播放| 美国黄色特级片| 激情综合在线| 国产精品爽爽爽| 黄色av网址在线| 国产精品欧美极品| 亚洲人精品午夜射精日韩 | 激情另类综合| 国产精品久久久精品| 免费a级片在线观看| 国产精品日产欧美久久久久| 缅甸午夜性猛交xxxx| 激情中国色综合| 亚洲精品v天堂中文字幕| 你懂得在线观看| 欧美专区18| 成人欧美一区二区| 天堂а√在线资源在线| 欧美性极品xxxx做受| 性生活在线视频| 日韩精品免费一区二区三区| 欧美亚州一区二区三区| 精品久久久久成人码免费动漫| 国产色91在线| 波多野结衣家庭教师在线| 高清久久一区| 中文字幕最新精品| 无码人妻丰满熟妇精品| www.欧美精品一二区| 国产树林野战在线播放| 成人免费在线观看视频| 亚洲欧美成人网| 97免费在线观看视频| 国产成人自拍网| 免费久久久久久| jizzyou欧美16| 国产午夜精品免费一区二区三区| 日韩乱码一区二区| 成人黄色网址在线观看| 黑人巨茎大战欧美白妇| 中文字幕综合| 久久影视电视剧免费网站| 亚洲综合五月天婷婷丁香| 国产女人18水真多18精品一级做| 内射国产内射夫妻免费频道| 欧美freesex8一10精品| 97在线视频免费看| 亚洲AV午夜精品| 亚洲黄一区二区三区| 波多野结衣免费观看| 欧美黄色免费| 成人资源视频网站免费| 成人爽a毛片免费啪啪动漫| 欧美精品一区二区三区蜜桃| 免费中文字幕视频| 成人一区在线观看| 麻豆tv在线播放| 色婷婷狠狠五月综合天色拍| 91av成人在线| 国产永久免费高清在线观看| 91成人国产精品| 久久中文字幕精品| 另类人妖一区二区av| 一区二区三区四区不卡| 国产精品777777在线播放| 久久久久99精品久久久久| av资源免费看| 午夜视频久久久久久| 鲁大师私人影院在线观看| 久久av最新网址| 三级三级久久三级久久18| 日韩成人在线一区| 欧美俄罗斯性视频| 欧美新色视频| 欧美日韩国产一级片| 国产一区二区视频在线观看免费| 成人做爰69片免费看网站| 日韩国产欧美亚洲| 日韩精品首页| 肥熟一91porny丨九色丨| 无遮挡爽大片在线观看视频| 亚洲日韩中文字幕| 99在线无码精品入口| 亚洲一二三四在线观看| 无码人妻精品一区二区三应用大全 | 亚洲熟妇av乱码在线观看| 中文字幕综合网| 黄色性视频网站| 日本欧美在线观看| 国产1区2区3区中文字幕| 亚洲精华一区二区三区| 国产美女久久精品| 1234区中文字幕在线观看| 国产一区二区成人| 亚洲第一色网站| 欧美在线视频你懂得| 久久久久久久久久久网 | 99riav视频一区二区| 欧美成人激情视频免费观看| 三区在线观看| 日韩一区二区三区视频在线观看| www..com国产| 亚洲视频在线观看一区| 成人免费毛片糖心| 高清久久久久久| 亚洲一级免费观看| 国产免费成人| 一级黄色免费在线观看| 国产一区二区三区四区| 成人动漫视频在线观看免费| 成人黄色视屏网站| 91豆花精品一区| av中文字幕在线播放| 亚洲性无码av在线| 香蕉视频黄色片| 日韩一区二区三区精品视频| 国产亚洲欧美日韩高清| 午夜私人影院久久久久| 免费三片在线播放| 国产精品久久久久三级| 国产一二三四五区| 99久久精品情趣| 天天干天天曰天天操| 麻豆成人综合网| 黄色高清无遮挡| 制服诱惑一区二区| 天堂8在线天堂资源bt| 国产精品久久观看| 性欧美精品一区二区三区在线播放| 精品资源在线| 国产传媒一区二区| 清纯唯美激情亚洲| 亚洲iv一区二区三区| 欧美大陆国产| 国产精品自拍偷拍| 嫩草伊人久久精品少妇av杨幂| 日本免费一区二区三区视频观看| ririsao久久精品一区| 欧美日本亚洲视频| 影音先锋在线视频| 欧美刺激性大交免费视频| 91官网在线| 中文字幕亚洲欧美日韩2019| 国产高清av在线| 国产一区二区三区网站| 国产在线高清| 在线观看国产欧美| 91女主播在线观看| 久久精品视频在线播放| 国产黄大片在线观看画质优化| 中文字幕综合一区| 黄色免费网站在线| www.日本久久久久com.| 国产最新在线| 欧美大片免费观看| √天堂8资源中文在线| 97高清免费视频| 日本在线影院| 国产成人综合亚洲| 黄色成人在线观看网站| 91系列在线播放| 一区二区三区四区高清视频 | 999国产精品永久免费视频app| 一区二区三区|亚洲午夜| 五月综合激情| 波多野结衣 作品| 一区在线免费| 黄色国产精品视频| 久久精品99国产精品| 超碰91在线播放| 99热这里都是精品| 91l九色lporny| 亚洲视频免费观看| 国产无遮挡裸体免费视频| 黑人巨大精品欧美一区二区免费| 日韩综合在线观看| 欧美一区二视频| 日韩在线观看视频一区| 亚洲图片欧美午夜| 国产高清一区二区三区视频| 97香蕉久久超级碰碰高清版| 日韩精品第一| 成人在线视频电影| 欧美手机视频| 超碰超碰超碰超碰超碰| 久久午夜影视| 一本之道在线视频| 波多野结衣精品在线| 亚洲综合第一区| 亚洲一二三区视频在线观看| 无码无套少妇毛多18pxxxx| 欧美日本一区二区在线观看| 日本韩国在线观看| 日韩在线观看网址| 免费v片在线观看| 91精品国产自产在线| 老司机在线精品视频| 亚洲精品免费在线看| 一本色道久久综合一区| 亚洲天堂网一区| a在线欧美一区| 色哟哟一一国产精品| 欧美三级免费观看| 精品国产av 无码一区二区三区| 亚洲欧美另类在线观看| 在线中文字幕-区二区三区四区| 日韩av电影在线网| 成人资源在线播放| 亚洲一区二区自拍偷拍| 午夜在线播放视频欧美| 日本亚洲一区二区三区| 国产欧美一区视频| 99久在线精品99re8热| 欧美一区二区免费| 大地资源中文在线观看免费版| 久久久噜噜噜久噜久久| 91精品视频一区二区| 日韩成人在线资源| 日韩午夜激情| 久久久久亚洲av无码专区首jn| 欧美激情在线看| 中文字幕第15页| 精品国偷自产国产一区| 成人黄视频在线观看| 国产精品永久免费| 精品美女视频| 1024精品视频| 99精品久久99久久久久| 国产亚洲欧美久久久久| 欧美一区二区日韩一区二区| 麻豆tv免费在线观看| 国产精品日韩精品| 日韩久久精品| 校园春色 亚洲色图| 欧美国产精品v| 久久久精品毛片| 亚洲女人天堂成人av在线| 涩涩在线视频| 久久一区二区三区av| 影音先锋亚洲一区| 国产精品久久久久久亚洲色| 一区二区成人在线观看| 亚洲第一免费视频| 国内精品久久久久| 老牛精品亚洲成av人片| 免费无码毛片一区二三区| www.亚洲色图| 91精品国产乱码久久久张津瑜| 亚洲激情视频在线观看| 美女高潮在线观看| 人禽交欧美网站免费| 日本人妖一区二区| 九九热久久免费视频| 678五月天丁香亚洲综合网| 黄色国产网站在线播放| 999日本视频| 好看的亚洲午夜视频在线| av不卡中文字幕| 精品日韩中文字幕| 欧美孕妇孕交| 国产精品亚洲第一区| 五月天久久777| 黄色av电影网站| 五月开心婷婷久久| 精品久久av| 成人性生交大片免费看视频直播| 欧美一区二区三区久久精品茉莉花| 欧美色图校园春色| 五月天亚洲婷婷| 国产在线三区| 亚洲一区亚洲二区| 国产精品久久久久久久久久妞妞| 少妇按摩一区二区三区| 欧美三级欧美一级| 91网在线看| 美女黄毛**国产精品啪啪| 青青草视频一区| 久久国产美女视频| 精品一区二区亚洲| 欧美v亚洲v综合v国产v仙踪林| 欧美在线观看视频免费| 91麻豆视频网站| 91亚洲视频在线观看| 久久久久久综合网天天| 精品理论电影在线| 久久久久99人妻一区二区三区| 日韩欧美极品在线观看| 欧美a在线看| 久久大片网站| 久久精品噜噜噜成人av农村| 久久久久久久伊人| 国产亚洲精品日韩| 一区二区三区四区高清视频| 日本成人在线免费视频| 一级精品视频在线观看宜春院| 美女做暖暖视频免费在线观看全部网址91 | 日本熟妇人妻中出| 亚洲另类在线制服丝袜| 青青色在线视频| 风间由美久久久| 日韩av在线免费观看不卡| 久久香蕉精品视频| 中文字幕欧美日韩va免费视频| 国产精品调教| 超碰91在线播放| 欧美日韩精品免费观看视频| 婷婷电影在线观看|