嗯…在下的中文程度淺薄,所以這標題下得很難懂。舉個例子來說,當程式發生 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(),就可以取得目前執行中的類別名稱及方法名稱。
文章標籤
全站熱搜
