1. 程式人生 > >C# 應用程式,執行時異常資訊捕獲

C# 應用程式,執行時異常資訊捕獲

示例:

static class Program
{
    /// <summary>
    /// 應用程式的主入口點。
    /// </summary>
    [STAThread]
    static void Main()
    {
        ApplicationException.Run(call);     // 呼叫異常資訊捕獲類,進行異常資訊的捕獲
    }

    // 應用程式,入口邏輯
    public static void call()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        if (Update.Updated())
        {
            DependentFiles.checksAll();     // 檢測工具執行依賴檔案
            ToolSetting.Instance();         // 載入工具的配置資訊
                
            Application.Run(new Form4());
        }
    }

}
/// <summary>
/// 此類用於捕獲Application異常資訊
/// </summary>
class ApplicationException
{
    /// <summary>
    /// 定義委託介面處理函式,呼叫此類中的Main函式為應用新增異常資訊捕獲
    /// </summary>
    public delegate void ExceptionCall();

    public static void Run(ExceptionCall exCall)
    {
        try
        {
            //設定應用程式處理異常方式:ThreadException處理
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            //處理UI執行緒異常
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            //處理非UI執行緒異常
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

            if (exCall != null) exCall();
        }
        catch (Exception ex)
        {
            string str = GetExceptionMsg(ex, string.Empty);
            MessageBox.Show(str, "系統錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    ///////--------------------------------------------------------------------------

    ///// <summary>
    ///// 應用程式的主入口點。
    ///// </summary>
    //[STAThread]
    //static void Main()
    //{
    //    try
    //    {
    //        //設定應用程式處理異常方式:ThreadException處理
    //        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    //        //處理UI執行緒異常
    //        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    //        //處理非UI執行緒異常
    //        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    //        #region 應用程式的主入口點
    //        Application.EnableVisualStyles();
    //        Application.SetCompatibleTextRenderingDefault(false);
    //        Application.Run(new Form1());
    //        #endregion
    //    }
    //    catch (Exception ex)
    //    {
    //        string str = GetExceptionMsg(ex, string.Empty);
    //        MessageBox.Show(str, "系統錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
    //    }
    //}


    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        string str = GetExceptionMsg(e.Exception, e.ToString());
        MessageBox.Show(str, "系統錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);

        //bool ok = (MessageBox.Show(str, "系統錯誤,提交bug資訊?", MessageBoxButtons.OKCancel, MessageBoxIcon.Error) == DialogResult.OK);
        //if (ok) sendBugToAuthor(str);

        Update.Updated();      // 捕獲執行異常後,檢測是否有版本更新
        //LogManager.WriteLog(str);
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
        MessageBox.Show(str, "系統錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);

        //bool ok = (MessageBox.Show(str, "系統錯誤,提交bug資訊?", MessageBoxButtons.OKCancel, MessageBoxIcon.Error) == DialogResult.OK);
        //if (ok) sendBugToAuthor(str);

        Update.Updated();      // 捕獲執行異常後,檢測是否有版本更新
        //LogManager.WriteLog(str);
    }

    /// <summary>
    /// 生成自定義異常訊息
    /// </summary>
    /// <param name="ex">異常物件</param>
    /// <param name="backStr">備用異常訊息:當ex為null時有效</param>
    /// <returns>異常字串文字</returns>
    static string GetExceptionMsg(Exception ex, string backStr)
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("****************************異常文字****************************");
        sb.AppendLine("【出現時間】:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
        if (ex != null)
        {
            sb.AppendLine("【異常型別】:" + ex.GetType().Name);
            sb.AppendLine("【異常資訊】:" + ex.Message);
            sb.AppendLine("【堆疊呼叫】:" + ex.StackTrace);
            sb.AppendLine("【異常方法】:" + ex.TargetSite);
        }
        else
        {
            sb.AppendLine("【未處理異常】:" + backStr);
        }
        sb.AppendLine("***************************************************************");


        Update.Updated();      // 捕獲執行異常後,檢測是否有版本更新

        return sb.ToString();
    }
}

Update.Updated();  // 為我自己程式裡的更新邏輯,請刪除。