1. 程式人生 > >C#異常日誌的使用

C#異常日誌的使用

異常處理

    我們在編寫程式碼的時候少不了會出現異常,那麼我們在程式設計的時候就需要站在異常一定可能發生的角度來編寫C#或其他語言的自定義異常處理程式,應對程式可能發生的錯誤,建立一個良好的C#自定義異常處理策略。

  1. 在做C#自定義異常處理的時候,最好能在應用程式所有的入口處(事件處理函式,主函式,執行緒入口)使用try-catch。但是不要在程式建構函式入口處新增try-catch,因為此處產生異常,它自己並沒有能力來處理,因為它還沒有構造完畢,只能再向外層丟擲異常。
  2. 我們不能盲目的使用異常,因為使用異常可能會在一定程度上影響到程式的效能
  3. 將全域性異常處理函式的委託加入到Application.ThreadException中,實現全域性異常處理,但它只能處理主執行緒中未捕獲的異常。在多執行緒異常處理時,工作執行緒/輔執行緒中產生異常,可以把它轉給主執行緒來完成異常處理。如果執行緒之間不通知,是無法直接捕捉異常的。若沒有去處理工作執行緒/輔執行緒中產生的異常,該異常將會“消失”掉。
  4. 為什麼要把異常處理都交給主執行緒去做呢?舉個例子:在WinForm裡我們使用多執行緒來處理介面元素,一旦有異常發生就將異常訊息顯示出來。那麼,是直接在異常發生後就MessageBox,還是將訊息交給MainUI來統一顯示?試想一下,程式要是複雜點或是有多個介面採用多執行緒來顯示介面元素,那麼採用前者,我們就算知道了異常的詳細資訊,但可能還是很難找到究竟是哪裡出了問題。而通過MainUI來顯示,情況就要好很多了,尤其是還設計到其他東西的時候(如:多語言環境)。

日誌規約

  1. 應用中不可以直接使用日誌系統中的API,而應依賴使用日誌框架中的API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方法統一
  2. 日誌檔案推薦至少儲存15天,因為有些異常具備以“周”為頻次發生的特點
  3. 應用中的擴充套件體制(如打點、臨時監控、訪問日誌等)命名方式:
        appName_logType_logName.log 其中logType是日誌型別,logName是日誌描述。這種命名的好處有:可以通過檔名就可以知道日誌檔案屬於什麼應用,什麼剋行,什麼目的等。
  4. 避免重複打日誌,避免浪費磁碟空間。
  5. 謹慎記錄日誌,即使刪除觀察日誌

例項


/// <summary>
/// 將異常列印到LOG檔案
/// </summary>
/// <param name="ex">異常</param>
/// <param name="LogAddress">日誌檔案地址</param>
public static void WriteLog(Exception ex,string LogAddress="")
{
	//如果日誌檔案為空,則預設在Debug目錄下新建YYYY-mm-dd_Log.log檔案
	if(LogAddress=="")
	{
		LogAddress = Environment.CurrentDirectory + '\\' +
			DateTime.Now.Year + '-' +
			DateTime.Now.Month + '-' +
			DateTime.Now.Day + "_Log.log";
	}
  
  //把異常資訊輸出到檔案
  StreamWriter sw = new StreamWriter(LogAddress, true); 
  sw.WritLine("當前時間: " + DateTime.Now.ToString());
  
    sw.WriteLine("異常資訊:" + ex.Message);
    sw.WriteLine("異常物件:" + ex.Source);
    sw.WriteLine("呼叫堆疊:\n" + ex.StackTrace.Trim());
    sw.WriteLine("觸發方法:" + ex.TargetSite);
    sw.WriteLine();
    sw.Close();
}

    呼叫方法


try
{
    throw new Exception("測試異常");
}
catch (Exception ex)
{
    WriteLog(ex);


總結

    現在只是瞭解到這個打日誌挺重要的,剩下的還需要多去使用…