close

嗯…在下的中文程度淺薄,所以這標題下得很難懂。舉個例子來說,當程式發生 Exception 時,會用 catch block 來捕捉,通常程式設計師會順便把該類別及方法名稱一起記錄。但因為是把名稱寫死在字串變數裡,常常會有一些困擾,例如下列程式碼:

            try
            {
                InvokeSomeObject();
            }
            catch (Exception ex)
            {
                Log(ex, "class name");
            }

下次再有類似的需求,程式設計師肯定會用複製貼上的方法,照過去的經驗,通常 class name 都會忘了改,為了改善這種情況,可以用另外的方式來記錄。

    public static class CatchExceptionInfo
    {
        public static CallerInfo GetCallerInfo()
        {
            StackTrace stack = new StackTrace();
            CallerInfo callerInfo = new CallerInfo();
            string sDllName = stack.GetFrame(1).GetMethod().Module.Name;
            string sClassName = stack.GetFrame(1).GetMethod().ReflectedType.Name;
            string sMethodName = stack.GetFrame(1).GetMethod().Name;

            callerInfo.dllName = sDllName;
            callerInfo.className = sClassName;
            callerInfo.methodName = sMethodName;

            return callerInfo;
        }
    }

    public class CallerInfo
    {
        public string dllName { get; set; }
        public string className { get; set; }
        public string methodName { get; set; }
    }

上面的程式碼,用到的是 StackTrace 這個類別。程式呼叫 function 時,會將目前執行的狀態存在堆疊,利用這個類別,可以取得整個堆疊的狀態,所以在發生 Exception 時,直接呼叫 CatchExceptionInfo.GetCallerInfo(),就可以取得目前執行中的類別名稱及方法名稱。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 卑微研究生 的頭像
    卑微研究生

    卑微研究生的部落格

    卑微研究生 發表在 痞客邦 留言(0) 人氣()