彭杏财 發表於 2025-12-18 21:29:00

dotnet未捕获异常导致系统崩溃问题

<p>一般情况下我们业务代码不需要自己捕获异常,因为目前我们常用框架都会自行处理异常,但是有些情况下需要自己处理异常,否则未处理的异常抛出会导致程序崩溃退出。</p>
<h2 id="1全局异常捕获">1.全局异常捕获</h2>
<pre><code class="language-csharp">// 1. AppDomain 未处理异常
AppDomain.CurrentDomain.UnhandledException += (sender, e) =&gt;
{
    var exception = e.ExceptionObject as Exception;
    LogException(exception, "UnhandledException");
   
    if (e.IsTerminating)
    {
      // 进程即将终止
      EmergencyShutdown();
    }
};

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

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

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

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

</code></pre>
<h2 id="2timer异常-和-异步void方法异常">2.Timer异常 和 异步void方法异常</h2>
<p>定时器的事件方法中的代码抛出来的异常,无法被全局异常捕获,同样异步void方法异常也是的,需要自行捕获异常。</p>
<pre><code class="language-csharp">public class SafeTimer
{
    private readonly Timer _timer;
   
    public SafeTimer()
    {
      _timer = new Timer(OnTimerCallback);
    }
   
    private void OnTimerCallback(object state)
    {
      try
      {
            // 业务逻辑
      }
      catch (Exception ex)
      {
            // 记录日志,通知主线程
            LogException(ex);
      }
    }
}
</code></pre>
<h2 id="3stackoverflowexception和outofmemoryexception">3.StackOverflowException和OutOfMemoryException</h2>
<p>这两个异常业务无法捕获的,因为它们发生时,程序以及没有办法在执行如何代码了,只能靠上个文章中说的崩溃自动收集dump,然后去分析dump找出问题。<br>
还有其他比如调用c代码等不安全代码,大部分时候也时无法捕获,如果它们引起异常也很难捕获。</p>
<p>完</p>


</div>
<div id="MySignature" role="contentinfo">
    <div id="AllanboltSignature">
<p id="PSignature" style="border-top-color: #e0e0e0; border-top-width: 1px; border-top-style: dashed; border-right-color: #e0e0e0; border-right-width: 1px; border-right-style: dashed; border-bottom-color: #e0e0e0; border-bottom-width: 1px; border-bottom-style: dashed; border-left-color: #e0e0e0; border-left-width: 1px; border-left-style: dashed; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 80px; background-image: url(https://images.cnblogs.com/cnblogs_com/pains/109838/r_copyright.png); background-attachment: initial; background-origin: initial; background-clip: initial; font-family: 微软雅黑; font-size: 11px; background-color: #e5f1f4; background-position: 1% 50%; background-repeat: no-repeat no-repeat; ">
作者:Rick Carter
<br />
出处:http://pains.cnblogs.com/
<br />
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
</p>
</div><br><br>
来源:https://www.cnblogs.com/pains/p/19368944
頁: [1]
查看完整版本: dotnet未捕获异常导致系统崩溃问题