极品分享

C# WPF WinForm Windows服务的全局异常捕捉设置方法!

在桌面程序开发的时候,经常会用到try catch方式来捕捉异常信息,不仅麻烦而且很多麻烦问题。

所以就需要一个全局捕捉异常的需求,毕竟你无法考虑到所有出异常的情况,一旦异常闪退是很不友好的。

所以,今天我们介绍下捕捉方法。


一、window服务的全局异常捕捉:

public partial class MonitorOnServer : ServiceBase
    {
        public MonitorOnServer()
        {
            InitializeComponent();
            //委托未处理异常的处理方法
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
         }
         
        //定义委托处理函数
        void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                Exception ex = e.ExceptionObject as Exception;
                Log.Instance.AddLog("来自“MonitorOnServer”的全局异常。" + ex.Message + "详细信息如下:"
                                    + Environment.NewLine + "[InnerException]" + ex.InnerException
                                    + Environment.NewLine + "[Source]"  + ex.Source
                                    + Environment.NewLine + "[TargetSite]" + ex.TargetSite
                                    + Environment.NewLine + "[StackTrace]" + ex.StackTrace);
                Log.Instance.WriteLog(strLogPath);
            }
            catch
            {
            }
        }

    }


二、WinForm的全局异常捕捉:

/// <summary> 
/// 应用程序的主入口点。 
/// </summary> 
[STAThread] 
static void Main() 
{ 
     
    //应用程序的主入口点添加ThreadException的事件处理。 
    Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); 
     
}
//定义异常处理函数
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{ 
    //作为示例,这里用消息框显示异常的信息 
     MessageBox.Show(e.Exception.Message,"异常",MessageBoxButtons.OK,MessageBoxIcon.Error); 
}


三、WPF的全局异常捕捉:

App.xaml.cs

    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        public App()
        {
	    //委托指定方法处理未处理异常【UI线程】
            this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
            //委托指定方法处理未处理异常【非UI线程】
	    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        }
	//定义方法处理未处理异常【UI线程】
        void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                if (e.ExceptionObject is System.Exception)
                {
                    HandleException((System.Exception)e.ExceptionObject);
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }
	//定义方法处理未处理异常【非UI线程】
        void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            try
            {
                HandleException(e.Exception);
                e.Handled = true;
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }
	//定义异常日志记录方法
	public static void HandleException(Exception ex)
        {
            //记录日志
            if (!System.IO.Directory.Exists("Log"))
            {
                System.IO.Directory.CreateDirectory("Log");
            }
            DateTime now = DateTime.Now;
            string logpath = string.Format(@"Log\fatal_{0}{1}{2}.log", now.Year, now.Month, now.Day);
            System.IO.File.AppendAllText(logpath, string.Format("\r\n----------------------{0}--------------------------\r\n", now.ToString("yyyy-MM-dd HH:mm:ss")));
            System.IO.File.AppendAllText(logpath, ex.Message);
            System.IO.File.AppendAllText(logpath, "\r\n");
            System.IO.File.AppendAllText(logpath, ex.StackTrace);
            System.IO.File.AppendAllText(logpath, "\r\n");
            System.IO.File.AppendAllText(logpath, "\r\n----------------------footer--------------------------\r\n");
        }
    }
}


2017-04-25 0 /
NET学习
/
标签: 

评论回复

回到顶部