欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 系統(tǒng)全局的異常處理實(shí)現(xiàn)

 更新時(shí)間:2025年01月22日 09:29:25   作者:生命不息-學(xué)無(wú)止境  
在C#應(yīng)用程序中,異??赡茉谌魏蔚胤桨l(fā)生,本文主要介紹了C# 系統(tǒng)全局的異常處理實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1. 為什么需要系統(tǒng)全局異常處理

在C#應(yīng)用程序中,異??赡茉谌魏蔚胤桨l(fā)生。如果沒(méi)有適當(dāng)?shù)娜之惓L幚頇C(jī)制,當(dāng)一個(gè)未捕獲的異常出現(xiàn)時(shí),程序可能會(huì)突然崩潰,導(dǎo)致用戶體驗(yàn)差并且可能丟失數(shù)據(jù)。例如,在一個(gè)多層架構(gòu)的企業(yè)應(yīng)用程序中,異??赡馨l(fā)生在數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層或者表示層。系統(tǒng)全局異常處理可以捕獲這些未被局部處理的異常,記錄錯(cuò)誤信息,為用戶提供友好的錯(cuò)誤提示,并且可以嘗試進(jìn)行一些恢復(fù)操作或者至少能夠優(yōu)雅地關(guān)閉程序。

2. AppDomain全局異常處理(控制臺(tái)應(yīng)用程序和Windows服務(wù))

AppDomain事件介紹

在C#中,AppDomain代表一個(gè)應(yīng)用程序域,它是一個(gè)相對(duì)獨(dú)立的運(yùn)行環(huán)境。AppDomain.CurrentDomain.UnhandledException事件可以用于捕獲在應(yīng)用程序域內(nèi)未被處理的異常。當(dāng)任何線程在應(yīng)用程序域中拋出一個(gè)未被捕獲的異常時(shí),這個(gè)事件就會(huì)被觸發(fā)。

示例代碼

以下是一個(gè)控制臺(tái)應(yīng)用程序中使用AppDomain.CurrentDomain.UnhandledException事件來(lái)進(jìn)行全局異常處理的示例:

class Program
{
    static void Main()
    {
        // 訂閱AppDomain的未處理異常事件
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        try
        {
            // 可能會(huì)拋出異常的代碼
            throw new Exception("這是一個(gè)未被捕獲的異常");
        }
        catch (Exception ex)
        {
            Console.WriteLine("局部捕獲的異常:" + ex.Message);
        }
    }
    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine("全局未處理異常:" + ((Exception)e.ExceptionObject).Message);
    }
}

在這個(gè)例子中,我們首先訂閱了AppDomain.CurrentDomain.UnhandledException事件。然后,在try - catch塊中,我們故意拋出一個(gè)異常,這個(gè)異常在try - catch塊中被局部捕獲并打印消息。但是,如果我們沒(méi)有局部捕獲這個(gè)異常,那么AppDomain.CurrentDomain.UnhandledException事件處理程序就會(huì)被觸發(fā),打印全局未處理異常的消息。

3. Windows Forms應(yīng)用程序中的全局異常處理

Application事件介紹

在Windows Forms應(yīng)用程序中,可以使用System.Windows.Forms.Application.ThreadException事件來(lái)捕獲UI線程中的未處理異常。這個(gè)事件主要用于處理在UI操作(如按鈕點(diǎn)擊、菜單選擇等)過(guò)程中產(chǎn)生的未處理異常,防止UI因?yàn)楫惓6鴥鼋Y(jié)或崩潰。

示例代碼

以下是一個(gè)Windows Forms應(yīng)用程序中設(shè)置全局異常處理的示例:

static class Program
{
    [STAThread]
    static void Main()
    {
        // 訂閱Application的線程異常事件
        Application.ThreadException += Application_ThreadException;
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        MessageBox.Show("發(fā)生了一個(gè)未處理的UI線程異常:" + e.Exception.Message, "錯(cuò)誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

在這個(gè)例子中,在Main方法中,我們訂閱了System.Windows.Forms.Application.ThreadException事件。當(dāng)在UI線程中出現(xiàn)未處理的異常時(shí),會(huì)彈出一個(gè)消息框顯示異常信息,而不是讓UI界面因?yàn)楫惓6罎ⅰ?/p>

4. WPF應(yīng)用程序中的全局異常處理

Application事件介紹

在WPF應(yīng)用程序中,可以使用System.Windows.Application.DispatcherUnhandledException事件來(lái)捕獲UI線程中的未處理異常。與Windows Forms類(lèi)似,這個(gè)事件用于確保UI在面對(duì)未處理異常時(shí)能夠保持一定的穩(wěn)定性。

示例代碼

以下是一個(gè)WPF應(yīng)用程序中設(shè)置全局異常處理的示例:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        // 訂閱DispatcherUnhandledException事件
        this.DispatcherUnhandledException += App_DispatcherUnhandledException;
        base.OnStartup(e);
    }
    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        MessageBox.Show("發(fā)生了一個(gè)未處理的UI線程異常:" + e.Exception.Message, "錯(cuò)誤", MessageBoxButton.OK, MessageBoxImage.Error);
        e.Handled = true; // 標(biāo)記異常已處理,防止程序崩潰
    }
}

在這個(gè)例子中,在App類(lèi)的OnStartup方法中,我們訂閱了System.Windows.Application.DispatcherUnhandledException事件。當(dāng)異常發(fā)生時(shí),會(huì)彈出消息框顯示異常信息,并且通過(guò)設(shè)置e.Handled = true來(lái)告訴系統(tǒng)這個(gè)異常已經(jīng)被處理,避免WPF應(yīng)用程序因?yàn)檫@個(gè)未處理異常而崩潰。

5. ASP.NET應(yīng)用程序中的全局異常處理(Web Forms和MVC)

Web Forms中的全局異常處理

在ASP.NET Web Forms應(yīng)用程序中,可以使用Application_Error方法在Global.asax文件中設(shè)置全局異常處理。這個(gè)方法會(huì)在應(yīng)用程序發(fā)生未處理的錯(cuò)誤時(shí)被調(diào)用。例如:

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    // 記錄異常信息,例如寫(xiě)入日志文件
    LogError(ex);
    // 清除當(dāng)前錯(cuò)誤,防止ASP.NET默認(rèn)的錯(cuò)誤頁(yè)面顯示
    Server.ClearError();
    // 重定向到自定義的錯(cuò)誤頁(yè)面
    Response.Redirect("~/Error.aspx");
}

在這個(gè)例子中,當(dāng)發(fā)生未處理的錯(cuò)誤時(shí),我們首先獲取最后一個(gè)錯(cuò)誤(即引發(fā)問(wèn)題的異常),記錄這個(gè)異常信息(例如通過(guò)寫(xiě)入日志文件),清除當(dāng)前錯(cuò)誤,然后重定向用戶到一個(gè)自定義的錯(cuò)誤頁(yè)面,為用戶提供一個(gè)更友好的錯(cuò)誤展示。

MVC中的全局異常處理

public class GlobalExceptionFilter : HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        // 記錄異常信息
        LogError(context.Exception);
        // 設(shè)置結(jié)果為一個(gè)自定義的錯(cuò)誤視圖
        context.Result = new ViewResult
        {
            ViewName = "Error",
            ViewData = new ViewDataDictionary(context.Exception)
        };
        context.ExceptionHandled = true;
    }
}
  • 在ASP.NET MVC應(yīng)用程序中,可以通過(guò)實(shí)現(xiàn)System.Web.Mvc.HandleErrorAttribute類(lèi)或者使用ExceptionFilters來(lái)設(shè)置全局異常處理。例如,通過(guò)創(chuàng)建一個(gè)自定義的異常過(guò)濾器:
  • 然后在Global.asax文件或者通過(guò)FilterConfig類(lèi)將這個(gè)異常過(guò)濾器注冊(cè)為全局過(guò)濾器,這樣就可以在整個(gè)MVC應(yīng)用程序中捕獲和處理未處理的異常。

6. 記錄異常信息的重要性和方法

  • 重要性
    • 記錄異常信息對(duì)于診斷問(wèn)題、跟蹤錯(cuò)誤和改進(jìn)應(yīng)用程序非常重要。通過(guò)查看異常記錄,開(kāi)發(fā)人員可以了解異常發(fā)生的位置、原因和頻率,從而采取相應(yīng)的措施來(lái)修復(fù)代碼、優(yōu)化性能或者調(diào)整系統(tǒng)配置。例如,在一個(gè)生產(chǎn)環(huán)境的服務(wù)器應(yīng)用程序中,記錄異常信息可以幫助運(yùn)維人員快速定位和解決問(wèn)題,減少系統(tǒng)停機(jī)時(shí)間。
  • 方法
    • 日志文件:可以使用System.IO中的類(lèi)(如StreamWriter)或者第三方日志框架(如log4net、NLog)來(lái)將異常信息寫(xiě)入日志文件。例如,使用log4net
    public class LoggingHelper
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(LoggingHelper));
        public static void LogException(Exception ex)
        {
            log.Error("發(fā)生異常", ex);
        }
    }
    
    • 數(shù)據(jù)庫(kù):將異常信息存儲(chǔ)到數(shù)據(jù)庫(kù)中可以方便地進(jìn)行查詢和統(tǒng)計(jì)??梢詣?chuàng)建一個(gè)專(zhuān)門(mén)的表用于存儲(chǔ)異常記錄,包括異常類(lèi)型、消息、發(fā)生時(shí)間、調(diào)用堆棧等信息。
    • 事件查看器(Windows):在Windows環(huán)境下,可以將異常信息發(fā)送到事件查看器。通過(guò)使用System.Diagnostics.EventLog類(lèi),可以將異常記錄添加到應(yīng)用程序相關(guān)的事件日志中,這樣系統(tǒng)管理員可以通過(guò)事件查看器來(lái)查看和管理異常記錄。

到此這篇關(guān)于C# 系統(tǒng)全局的異常處理實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# 系統(tǒng)全局異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C#動(dòng)態(tài)創(chuàng)建Access數(shù)據(jù)庫(kù)及表的方法

    C#動(dòng)態(tài)創(chuàng)建Access數(shù)據(jù)庫(kù)及表的方法

    這篇文章主要介紹了C#動(dòng)態(tài)創(chuàng)建Access數(shù)據(jù)庫(kù)及表的方法,以實(shí)例形式分析了創(chuàng)建access數(shù)據(jù)庫(kù)及在access數(shù)據(jù)庫(kù)中建表的完整過(guò)程,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • C#開(kāi)發(fā)Winform實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    C#開(kāi)發(fā)Winform實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章介紹了C#開(kāi)發(fā)Winform實(shí)現(xiàn)學(xué)生管理系統(tǒng)的項(xiàng)目案例,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • c#中利用委托反射將DataTable轉(zhuǎn)換為實(shí)體集的代碼

    c#中利用委托反射將DataTable轉(zhuǎn)換為實(shí)體集的代碼

    c#中利用委托反射將DataTable轉(zhuǎn)換為實(shí)體集的代碼,需要的朋友可以參考下
    2012-10-10
  • C#接口interface用法實(shí)例

    C#接口interface用法實(shí)例

    這篇文章主要介紹了C#接口interface用法,實(shí)例分析了C#接口的基本使用方法,需要的朋友可以參考下
    2015-06-06
  • c# 泛型類(lèi)型參數(shù)與約束的深入分析

    c# 泛型類(lèi)型參數(shù)與約束的深入分析

    本篇文章是對(duì)c#中泛型類(lèi)型參數(shù)與約束進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#中List<T>存放元素的工作機(jī)制

    C#中List<T>存放元素的工作機(jī)制

    這篇文章介紹了C#中List<T>存放元素的工作機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • c#網(wǎng)絡(luò)喚醒功能實(shí)現(xiàn)

    c#網(wǎng)絡(luò)喚醒功能實(shí)現(xiàn)

    網(wǎng)絡(luò)喚醒實(shí)現(xiàn)了對(duì)網(wǎng)絡(luò)的集中管理,即在任何時(shí)刻,網(wǎng)管中心的IT管理人員可以經(jīng)由網(wǎng)絡(luò)遠(yuǎn)程喚醒一臺(tái)處于休眠或關(guān)機(jī)狀態(tài)的計(jì)算機(jī),下面使用c#實(shí)現(xiàn)網(wǎng)絡(luò)喚醒功能
    2014-01-01
  • C#開(kāi)發(fā)WinForm根據(jù)條件改變DataGridView行顏色

    C#開(kāi)發(fā)WinForm根據(jù)條件改變DataGridView行顏色

    這篇文章介紹了C#開(kāi)發(fā)WinForm根據(jù)條件改變DataGridView行顏色的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#線程定義和使用方法詳解

    C#線程定義和使用方法詳解

    這篇文章主要介紹了C#Thread類(lèi)的基本用法,如何定義一個(gè)線程類(lèi),為線程傳遞參數(shù)的方法,詳解看下文
    2013-11-11
  • C# 如何調(diào)用C++ dll string類(lèi)型返回

    C# 如何調(diào)用C++ dll string類(lèi)型返回

    這篇文章主要介紹了C# 如何調(diào)用C++ dll string類(lèi)型返回問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論