C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# 系统全局异常

C# 系统全局的异常处理实现

作者:生命不息-学无止境

在C#应用程序中,异常可能在任何地方发生,本文主要介绍了C# 系统全局的异常处理实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 为什么需要系统全局异常处理

在C#应用程序中,异常可能在任何地方发生。如果没有适当的全局异常处理机制,当一个未捕获的异常出现时,程序可能会突然崩溃,导致用户体验差并且可能丢失数据。例如,在一个多层架构的企业应用程序中,异常可能发生在数据访问层、业务逻辑层或者表示层。系统全局异常处理可以捕获这些未被局部处理的异常,记录错误信息,为用户提供友好的错误提示,并且可以尝试进行一些恢复操作或者至少能够优雅地关闭程序。

2. AppDomain全局异常处理(控制台应用程序和Windows服务)

AppDomain事件介绍

在C#中,AppDomain代表一个应用程序域,它是一个相对独立的运行环境。AppDomain.CurrentDomain.UnhandledException事件可以用于捕获在应用程序域内未被处理的异常。当任何线程在应用程序域中抛出一个未被捕获的异常时,这个事件就会被触发。

示例代码

以下是一个控制台应用程序中使用AppDomain.CurrentDomain.UnhandledException事件来进行全局异常处理的示例:

class Program
{
    static void Main()
    {
        // 订阅AppDomain的未处理异常事件
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        try
        {
            // 可能会抛出异常的代码
            throw new Exception("这是一个未被捕获的异常");
        }
        catch (Exception ex)
        {
            Console.WriteLine("局部捕获的异常:" + ex.Message);
        }
    }
    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine("全局未处理异常:" + ((Exception)e.ExceptionObject).Message);
    }
}

在这个例子中,我们首先订阅了AppDomain.CurrentDomain.UnhandledException事件。然后,在try - catch块中,我们故意抛出一个异常,这个异常在try - catch块中被局部捕获并打印消息。但是,如果我们没有局部捕获这个异常,那么AppDomain.CurrentDomain.UnhandledException事件处理程序就会被触发,打印全局未处理异常的消息。

3. Windows Forms应用程序中的全局异常处理

Application事件介绍

在Windows Forms应用程序中,可以使用System.Windows.Forms.Application.ThreadException事件来捕获UI线程中的未处理异常。这个事件主要用于处理在UI操作(如按钮点击、菜单选择等)过程中产生的未处理异常,防止UI因为异常而冻结或崩溃。

示例代码

以下是一个Windows Forms应用程序中设置全局异常处理的示例:

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("发生了一个未处理的UI线程异常:" + e.Exception.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

在这个例子中,在Main方法中,我们订阅了System.Windows.Forms.Application.ThreadException事件。当在UI线程中出现未处理的异常时,会弹出一个消息框显示异常信息,而不是让UI界面因为异常而崩溃。

4. WPF应用程序中的全局异常处理

Application事件介绍

在WPF应用程序中,可以使用System.Windows.Application.DispatcherUnhandledException事件来捕获UI线程中的未处理异常。与Windows Forms类似,这个事件用于确保UI在面对未处理异常时能够保持一定的稳定性。

示例代码

以下是一个WPF应用程序中设置全局异常处理的示例:

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("发生了一个未处理的UI线程异常:" + e.Exception.Message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
        e.Handled = true; // 标记异常已处理,防止程序崩溃
    }
}

在这个例子中,在App类的OnStartup方法中,我们订阅了System.Windows.Application.DispatcherUnhandledException事件。当异常发生时,会弹出消息框显示异常信息,并且通过设置e.Handled = true来告诉系统这个异常已经被处理,避免WPF应用程序因为这个未处理异常而崩溃。

5. ASP.NET应用程序中的全局异常处理(Web Forms和MVC)

Web Forms中的全局异常处理

在ASP.NET Web Forms应用程序中,可以使用Application_Error方法在Global.asax文件中设置全局异常处理。这个方法会在应用程序发生未处理的错误时被调用。例如:

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    // 记录异常信息,例如写入日志文件
    LogError(ex);
    // 清除当前错误,防止ASP.NET默认的错误页面显示
    Server.ClearError();
    // 重定向到自定义的错误页面
    Response.Redirect("~/Error.aspx");
}

在这个例子中,当发生未处理的错误时,我们首先获取最后一个错误(即引发问题的异常),记录这个异常信息(例如通过写入日志文件),清除当前错误,然后重定向用户到一个自定义的错误页面,为用户提供一个更友好的错误展示。

MVC中的全局异常处理

public class GlobalExceptionFilter : HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        // 记录异常信息
        LogError(context.Exception);
        // 设置结果为一个自定义的错误视图
        context.Result = new ViewResult
        {
            ViewName = "Error",
            ViewData = new ViewDataDictionary(context.Exception)
        };
        context.ExceptionHandled = true;
    }
}

6. 记录异常信息的重要性和方法

到此这篇关于C# 系统全局的异常处理实现的文章就介绍到这了,更多相关C# 系统全局异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文