惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
H
Help Net Security
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
V
V2EX
M
MIT News - Artificial intelligence
Vercel News
Vercel News
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
B
Blog RSS Feed
D
Docker
V
Visual Studio Blog
博客园 - 叶小钗
美团技术团队
S
SegmentFault 最新的问题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

博客园 - Rick Carter

官方APP太难用了,所以我写了个 OpenNas App 死锁是怎么发生的,举个简单的例子 hangfire内部执行器是同步的,会导致死锁 缓存读写代码逻辑的正确姿势 dotnet-dump安装、收集dump和崩溃自动收集dump EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包) 修复达梦EFCore驱动布尔类型兼容问题 dotnet使用redis时需要注意的问题 巧用 using 作用域(IDisposable)的生命周期包装特性 实现前后置处理 非托管内存怎么计算? dotnet集合类型性能优化的两个小儿科的知识点 一个前端树形控件联动勾选框卡顿问题及解决 .net c# Func<Task>及变体做为多播委托异步执行会另开线程的问题 关于EFCore插件API使用中踩过的坑 利用C#9.0中的record提高性能 dotnet CultureInfo遇到欧洲如俄文小数点是逗号想转点的解决办法 hangfire.entityframeworkcore这个库因为System.Threading.Timer未停止也未释放而导致的性能问题 达梦DM.Microsoft.EntityFreameworkCore查询报错invalid cast from DateTime to DateTimeOffset 达梦DOTNET驱动DM.Provider8.3.1.30495存在空字符串插入变DBNull的问题 是否可以考虑做一个dotnet应用的性能诊断工具
dotnet未捕获异常导致系统崩溃问题
Rick Carter · 2025-12-18 · via 博客园 - Rick Carter

一般情况下我们业务代码不需要自己捕获异常,因为目前我们常用框架都会自行处理异常,但是有些情况下需要自己处理异常,否则未处理的异常抛出会导致程序崩溃退出。

1.全局异常捕获

// 1. AppDomain 未处理异常
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
    var exception = e.ExceptionObject as Exception;
    LogException(exception, "UnhandledException");
    
    if (e.IsTerminating)
    {
        // 进程即将终止
        EmergencyShutdown();
    }
};

// 2. Task 未观察异常 (.NET 4.0+)
TaskScheduler.UnobservedTaskException += (sender, e) =>
{
    LogException(e.Exception, "UnobservedTaskException");
    e.SetObserved(); // 防止进程崩溃
};

// 3. Windows Forms
if (Application.MessageLoop)
{
    Application.ThreadException += (sender, e) =>
    {
        LogException(e.ception, "ThreadException");
    };
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
}

// 4. WPF
Dispatcher.CurrentDispatcher.UnhandledException += (sender, e) =>
{
    LogException(e.Exception, "DispatcherUnhandledException");
    e.Handled = true; // 阻止进程崩溃
};

// 5. ASP.NET Core
// 在 Program.cs 中使用 UseExceptionHandler 中间件

2.Timer异常 和 异步void方法异常

定时器的事件方法中的代码抛出来的异常,无法被全局异常捕获,同样异步void方法异常也是的,需要自行捕获异常。

public class SafeTimer
{
    private readonly Timer _timer;
    
    public SafeTimer()
    {
        _timer = new Timer(OnTimerCallback);
    }
    
    private void OnTimerCallback(object state)
    {
        try
        {
            // 业务逻辑
        }
        catch (Exception ex)
        {
            // 记录日志,通知主线程
            LogException(ex);
        }
    }
}

3.StackOverflowException和OutOfMemoryException

这两个异常业务无法捕获的,因为它们发生时,程序以及没有办法在执行如何代码了,只能靠上个文章中说的崩溃自动收集dump,然后去分析dump找出问题。
还有其他比如调用c代码等不安全代码,大部分时候也时无法捕获,如果它们引起异常也很难捕获。