在桌面程序开发的时候,经常会用到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"); } } }
评论回复