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

 更新时间:2025年01月22日 09:29:25   作者:生命不息-学无止境  
在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;
    }
}
  • 在ASP.NET MVC应用程序中,可以通过实现System.Web.Mvc.HandleErrorAttribute类或者使用ExceptionFilters来设置全局异常处理。例如,通过创建一个自定义的异常过滤器:
  • 然后在Global.asax文件或者通过FilterConfig类将这个异常过滤器注册为全局过滤器,这样就可以在整个MVC应用程序中捕获和处理未处理的异常。

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

  • 重要性
    • 记录异常信息对于诊断问题、跟踪错误和改进应用程序非常重要。通过查看异常记录,开发人员可以了解异常发生的位置、原因和频率,从而采取相应的措施来修复代码、优化性能或者调整系统配置。例如,在一个生产环境的服务器应用程序中,记录异常信息可以帮助运维人员快速定位和解决问题,减少系统停机时间。
  • 方法
    • 日志文件:可以使用System.IO中的类(如StreamWriter)或者第三方日志框架(如log4netNLog)来将异常信息写入日志文件。例如,使用log4net
    public class LoggingHelper
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(LoggingHelper));
        public static void LogException(Exception ex)
        {
            log.Error("发生异常", ex);
        }
    }
    
    • 数据库:将异常信息存储到数据库中可以方便地进行查询和统计。可以创建一个专门的表用于存储异常记录,包括异常类型、消息、发生时间、调用堆栈等信息。
    • 事件查看器(Windows):在Windows环境下,可以将异常信息发送到事件查看器。通过使用System.Diagnostics.EventLog类,可以将异常记录添加到应用程序相关的事件日志中,这样系统管理员可以通过事件查看器来查看和管理异常记录。

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

相关文章

  • 详解C# wpf如何嵌入hwnd窗口

    详解C# wpf如何嵌入hwnd窗口

    wpf是Direct UI,窗口中只有一个hwnd句柄,大部分控件都是直接在上面绘制的,本文主要来和大家讲讲如何嵌入hwnd窗口,感兴趣的可以了解一下
    2024-03-03
  • C#中常见的文件处理操作小结

    C#中常见的文件处理操作小结

    这篇文章主要为大家详细介绍了C#中常见的一些文件处理操作,例如文件管理,获取文件信息和控制处理文件,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • c#中Empty()和DefalutIfEmpty()用法分析

    c#中Empty()和DefalutIfEmpty()用法分析

    这篇文章主要介绍了c#中Empty()和DefalutIfEmpty()用法,以实例形式分析了针对不同情况下Empty()和DefalutIfEmpty()用法区别,需要的朋友可以参考下
    2014-11-11
  • 在.net应用程序中运行其它EXE文件的方法

    在.net应用程序中运行其它EXE文件的方法

    这篇文章主要介绍了在.net应用程序中运行其它EXE文件的方法,涉及C#进程操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • C# winform自定义翻页控件详解

    C# winform自定义翻页控件详解

    这篇文章主要为大家详细介绍了C# winform自定义翻页控件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • C#基于正则表达式实现获取网页中所有信息的网页抓取类实例

    C#基于正则表达式实现获取网页中所有信息的网页抓取类实例

    这篇文章主要介绍了C#基于正则表达式实现获取网页中所有信息的网页抓取类,结合完整实例形式分析了C#正则网页抓取类与使用技巧,需要的朋友可以参考下
    2017-05-05
  • C# WinForms程序调用Python脚本的完整代码案例

    C# WinForms程序调用Python脚本的完整代码案例

    本文介绍了一个完整的C# WinForms应用程序,该应用程序通过下拉框选择并执行不同的Python脚本,文章详细描述了项目结构、Python脚本准备、C#代码实现、使用说明和配置说明,并提供了功能特点和扩展建议,需要的朋友可以参考下
    2025-11-11
  • C#使用RegNotifyChangeKeyValue监听注册表更改的方法小结

    C#使用RegNotifyChangeKeyValue监听注册表更改的方法小结

    RegNotifyChangeKeyValue的最后一个参数传递false,表示以同步的方式监听,这篇文章主要介绍了C#使用RegNotifyChangeKeyValue监听注册表更改的方法小结,需要的朋友可以参考下
    2024-06-06
  • WinForm使用DataGridView实现类似Excel表格的查找替换功能

    WinForm使用DataGridView实现类似Excel表格的查找替换功能

    这篇文章主要介绍了WinForm使用DataGridView实现类似Excel表格的查找替换功能,现在小编通过本文给大家分享查找替换实现过程,需要的朋友可以参考下
    2021-07-07
  • C#调用MATLAB函数的实现步骤

    C#调用MATLAB函数的实现步骤

    本文介绍了在C#中调用MATLAB函数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07

最新评论