设为首页 加入收藏

TOP

wpf 单例模式和异常处理 (原发布 csdn 2017-04-12 20:34:12)(一)
2019-09-18 11:11:43 】 浏览:97
Tags:wpf 单例 模式 异常 处理 发布 csdn 2017-04-12 20:34:12

第一次写博客,如有错误,请大家及时告知,本人立即改之。

如果您有好的想法或者建议,我随时与我联系。

如果发现代码有误导时,请与我联系,我立即改之。

好了不多说,直接贴代码。

一般的错误,使用下面三个就可以了。我不太赞同项目里面大量使用try{}catch{}(释放资源除外)

// 设置UI线程发生异常时处理函数
System.Windows.Application.Current.DispatcherUnhandledException += App_DispatcherUnhandledException;

// 设置非UI线程发生异常时处理函数
AppDomain.CurrentDomain.UnhandledException += App_CurrentDomainUnhandledException;

// 设置托管代码异步线程发生异常时处理函数
TaskScheduler.UnobservedTaskException += EventHandler_UnobservedTaskException;

特殊情况下,此函数可检测到c++封装的dll(不是百分之百可以检测到)

public delegate int CallBack(ref long a);
CallBack myCall;

[DllImport("kernel32")]
private static extern Int32 SetUnhandledExceptionFilter(CallBack cb);
    
// 设置非托管代码发生异常时处理函数
callBack = new CallBack(ExceptionFilter);
SetUnhandledExceptionFilter(callBack);

此函数可让程序"美化"结束。

完整代码:

public partial class App : Application
{
        [System.Runtime.InteropServices.DllImport("kernel32")]
        private static extern Int32 SetUnhandledExceptionFilter(CallBack cb);

        private delegate int CallBack(ref long a);

        private CallBack callBack;

        private System.Threading.Mutex mutex;

        public App()
        {
            Startup += new System.Windows.StartupEventHandler(App_Startup);
        }

        private void App_Startup(object sender, System.Windows.StartupEventArgs e)
        {
            mutex = new System.Threading.Mutex(true, $"{System.Reflection.Assembly.GetEntryAssembly().GetName().Name} - 8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F", out bool ret);
            if (!ret)
            {
                System.Windows.MessageBox.Show($"{System.Reflection.Assembly.GetEntryAssembly().GetName().Name} has already started up.",
                    "App_Startup",
                    System.Windows.MessageBoxButton.OK,
                    System.Windows.MessageBoxImage.Information);
                Environment.Exit(0);
                return;
            }

           Log4net.Init(typeof(MainWindow));
           
            // 设置UI线程发生异常时处理函数
            System.Windows.Application.Current.DispatcherUnhandledException += App_DispatcherUnhandledException;

            // 设置非UI线程发生异常时处理函数
            AppDomain.CurrentDomain.UnhandledException += App_CurrentDomainUnhandledException;

            // 设置非托管代码发生异常时处理函数
            callBack = new CallBack(ExceptionFilter);
            SetUnhandledExceptionFilter(callBack);

            // 设置托管代码异步线程发生异常时处理函数
            TaskScheduler.UnobservedTaskException += EventHandler_UnobservedTaskException;
        }

    void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        Log4net.gLogger.Error("--<App_DispatcherUnhandledException>--" + e.Exception.ToString());
        System.Windows.Forms.MessageBox.Show(e.Exception.ToString(),
            "Error",
            System.Windows.Forms.MessageBoxButtons.OK,
            System.Windows.Forms.MessageBoxIcon.Error);

        e.Handled = true;
    }

    void App_CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Log4net.gLogger.Fatal("--<App_CurrentDomainUnhandledException>--" + e.ExceptionObject.ToString());
        if (System.Windows.Forms.DialogResult.Yes
            == System.Windows.Forms.MessageBox.Show(
            "软件出现不可恢复错误,即将关闭。是否选择生成Dump文件以供开发人员分析问题?",
            "Error", System.Windows.Forms.MessageBoxButtons.YesNo,
            System.Windows.Forms.MessageBoxIcon.Error, System.Windows.Forms.MessageBoxDefaultButton.Button1))
        {
            WriteDump
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇WPF 启动页面 (原发布 csdn 2017.. 下一篇Winform中跨窗体设置Zedgraph的属..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目