C#全局异常处理通过AppDomain和TaskScheduler事件捕获未处理异常,前者用于WinForms/WPF应用,后者处理异步任务异常,结合日志记录与用户友好提示,确保程序稳定性,且不影响正常性能。

C#全局异常处理,简单来说,就是为你的程序设置一个“安全网”,当程序在运行时出现未被捕获的异常时,这个“安全网”就会启动,防止程序崩溃,并允许你记录错误信息,甚至尝试恢复。
全局异常处理的核心在于捕获那些未被try-catch块处理的异常。
实现C#全局异常处理主要有两种方式:
1. Application Domain级别的异常处理 (WinForms/WPF)
这种方式通过监听
AppDomain.CurrentDomain.UnhandledException
using System;
using System.Windows.Forms; // 或者 using System.Windows; 对于WPF
namespace GlobalExceptionHandlerExample
{
static class Program
{
[STAThread]
static void Main()
{
// 订阅未处理异常事件
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); // 你的主窗体
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// 处理未处理的异常
Exception ex = (Exception)e.ExceptionObject;
// 记录日志
Console.WriteLine("全局异常处理: " + ex.Message);
// 或者使用更专业的日志库,如NLog, Serilog
// 显示错误信息给用户 (可选)
MessageBox.Show("程序出现未预料的错误,请查看日志文件。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
// 决定是否终止程序
// e.IsTerminating = true; // 默认是false,如果设置为true,程序会立即终止
}
}
}重点:
Main
AppDomain.CurrentDomain.UnhandledException
CurrentDomain_UnhandledException
e.ExceptionObject
e.IsTerminating
2. TaskScheduler级别的异常处理 (异步操作)
对于异步操作,未处理的异常可能不会直接触发
AppDomain.CurrentDomain.UnhandledException
TaskScheduler.UnobservedTaskException
using System;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
// 订阅未观察到的Task异常事件
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
// 启动一个Task,故意抛出一个异常
Task.Run(() => { throw new Exception("Task中发生的异常!"); });
// 强制垃圾回收,触发UnobservedTaskException事件
GC.Collect();
GC.WaitForPendingFinalizers();
Console.ReadKey();
}
private static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
// 处理未观察到的Task异常
Exception ex = e.Exception.InnerException; // 获取实际的异常
Console.WriteLine("Task异常处理: " + ex.Message);
// 标记异常已被处理,防止程序崩溃
e.SetObserved();
}
}重点:
TaskScheduler.UnobservedTaskException
await
.Result
e.Exception.InnerException
e.SetObserved()
全局异常处理本身不会显著影响性能,因为它只有在发生未处理的异常时才会被触发。但是,如果在异常处理程序中执行大量的日志记录、资源清理或其他耗时操作,可能会对性能产生一定的影响。因此,建议在全局异常处理程序中尽量减少不必要的计算和I/O操作。
ASP.NET Core 提供了多种处理异常的方式,包括:
使用Exception Filter的示例:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
public class GlobalExceptionFilter : IExceptionFilter
{
private readonly ILogger<GlobalExceptionFilter> _logger;
public GlobalExceptionFilter(ILogger<GlobalExceptionFilter> logger)
{
_logger = logger;
}
public void OnException(ExceptionContext context)
{
_logger.LogError(context.Exception, "发生全局异常");
// 可以根据异常类型返回不同的结果
if (context.Exception is ArgumentNullException)
{
context.Result = new BadRequestObjectResult("参数错误");
}
else
{
context.Result = new StatusCodeResult(500);
}
context.ExceptionHandled = true; // 标记异常已被处理
}
}需要在
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.Filters.Add(typeof(GlobalExceptionFilter));
});
}全局异常处理并非万能的。 理想情况下,应该尽可能地在代码中处理异常,只有在无法预料的情况下才依赖全局异常处理。
以上就是C#的全局异常处理是什么?如何实现?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号