C# WPF全局捕获异常 防止程序崩溃闪退

5 篇文章 0 订阅
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace ClearWord
{
    /// <summary>
    /// App
    /// </summary>
    public partial class App : Application
    {        
        protected override void OnStartup(StartupEventArgs e)
        {
            RegisterEvents();
            base.OnStartup(e);
        }

        private void RegisterEvents()
        {
            //Task线程内未捕获异常处理事件
            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;//Task异常 

            //UI线程未捕获异常处理事件(UI主线程)
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;

            //非UI线程未捕获异常处理事件(例如自己创建的一个子线程)
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        }

        private static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
        {
            try
            {
                var exception = e.Exception as Exception;
                if (exception != null)
                {
                    HandleException(exception);
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                e.SetObserved();
            }
        }

        //非UI线程未捕获异常处理事件(例如自己创建的一个子线程)      
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                var exception = e.ExceptionObject as Exception;
                if (exception != null)
                {
                    HandleException(exception);
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                //ignore
            }
        }

        //UI线程未捕获异常处理事件(UI主线程)
        private static void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            try
            {
                HandleException(e.Exception);
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                e.Handled = true;
            }
        }
        private static void HandleException(Exception ex)
        {
            // MessageBox.Show("出错了,请与开发人员联系:"+ ex.Message);
            //记录日志
            Utils.LogWrite(ex);

        }
    }

}

 

//Utils.LogWrite
//读写锁,当资源处于写入模式时,其他线程写入需要等待本次写入结束之后才能继续写入
private static readonly ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim();
public static void LogWrite(Exception ex)
{
    if (!Directory.Exists("Log"))
    {
        Directory.CreateDirectory("Log");
    }
    var now = DateTime.Now;
    var logpath = @"Log\" + now.Year + "" + now.Month + "" + now.Day + ".log";
    var log = "\r\n----------------------" + DateTime.Now + " --------------------------\r\n"
              + ex.Message
              + "\r\n"
              + ex.InnerException
              + "\r\n"
              + ex.StackTrace
              + "\r\n----------------------footer--------------------------\r\n";
    try
    {
        //设置读写锁为写入模式独占资源,其他写入请求需要等待本次写入结束之后才能继续写入
        LogWriteLock.EnterWriteLock();
        File.AppendAllText(logpath, log);
    }
    finally
    {
        //退出写入模式,释放资源占用
        LogWriteLock.ExitWriteLock();
    }
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 要防止 WPF 程序闪退,可以考虑以下几种方法: 1. 异常处理:使用 try-catch 语句捕获异常,在 catch 块中对异常进行处理,以避免程序闪退。 2. 调试:启用调试功能,以便能够在程序出现问题时定位问题的源头。 3. 资源管理:管理程序中的资源,确保不会出现内存泄漏等问题,从而避免程序闪退。 4. 升级软件:确保使用最新版本的软件,因为新版本通常会修复已知的问题。 5. 数据备份:定期备份数据,以便在程序闪退时能够恢复数据。 以上是一些常见的防止 WPF 程序闪退的方法,希望能对您有所帮助。 ### 回答2: WPF程序闪退指的是在运行时突然退出,并且没有任何错误信息提示。常见的原因包括未处理的异常、内存泄漏等。为了防止WPF程序闪退,我们可以采取以下几个步骤: 1. 异常处理:在关键代码块中使用try-catch语句来捕获可能出现的异常,并在catch块中添加适当的处理逻辑。这样可以避免未处理的异常导致程序闪退。 2. 内存管理:使用合适的方式管理内存,避免内存泄漏。及时释放不再使用的对象、资源,避免过度创建和保持大量的对象等。可以使用using语句对于实现IDisposable接口的对象进行释放。 3. 错误日志记录:在程序中添加错误日志记录的功能,当程序出现异常时,将异常信息记录到日志文件中。这样有助于我们追踪和调试程序的问题,并且可以提供错误信息用于后续的改进。 4. 合理的异常处理策略:对于可能引发异常的操作,采取合理的处理策略。例如,在数据操作时,可以添加有效的检查和验证逻辑,避免不合法的输入导致异常。 5. 定期进行代码审查和测试:定期对程序进行代码审查和测试,检查是否存在潜在的问题和隐患。可以使用自动化测试工具进行集成测试、单元测试等,以确保程序的稳定性和可靠性。 通过上述措施,我们可以提高WPF程序的稳定性,避免闪退现象的发生,提供更好的用户体验。同时,及时修复问题,改进代码,可以使程序更加健壮和可维护。 ### 回答3: WPF(Windows Presentation Foundation)是一种用于创建用户界面的技术。避免闪退的关键是处理异常和错误情况,并进行适当的错误处理。下面是一些防止WPF程序闪退的方法: 1. 异常处理:使用try-catch语句捕获可能出现的异常。在关键代码段中使用try-catch语句,以便可以捕获并处理异常捕获异常后,可以显示错误信息或执行其他适当的错误处理操作。 2. 异常日志记录:在发生异常时,将异常信息记录在日志文件中。创建一个全局异常处理程序,以便可以捕获并记录任何未处理的异常。通过记录异常信息,可以帮助开发人员诊断问题并进行正确的修复。 3. 输入验证:对于用户输入的数据,进行适当的验证和检查。确保数据的有效性和完整性,以避免因为无效输入导致程序异常退出。 4. 内存管理:管理好资源的生命周期和释放。确保及时释放不再使用的资源,避免内存泄漏或资源耗尽导致程序崩溃。 5. 异步编程:在需要执行长时间运行的操作时,使用异步编程模型。通过异步操作,可以避免在UI线程上阻塞,提高程序的响应性和稳定性。 6. 定期更新和优化:定期对程序进行更新和优化,修复已知的问题,并改进性能。通过持续改进,可以增强程序的稳定性,减少闪退的可能性。 综上所述,通过合理的异常处理、输入验证、内存管理、异步编程、定期更新优化,可以有效地避免WPF程序闪退问题,提高程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackieZhengChina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值