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(),就可以取得目前執行中的類別名稱及方法名稱。
全站熱搜