dotnet未捕获异常导致系统崩溃问题
<p>一般情况下我们业务代码不需要自己捕获异常,因为目前我们常用框架都会自行处理异常,但是有些情况下需要自己处理异常,否则未处理的异常抛出会导致程序崩溃退出。</p><h2 id="1全局异常捕获">1.全局异常捕获</h2>
<pre><code class="language-csharp">// 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 中间件
</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]