[ C# 開發隨筆 ] 如何取得當下的 Function Name 與 Class Name,紀錄 Exception Log 更簡便

如何取得當下 Function Name 與 Class Name、紀錄 Exception Log 更簡便? StackFrame 與 MethodBase 是你不可或缺的好幫手!

在開發程式時,有時候我們需要在發生 Exception 時紀錄 Log,以便日後 Debug。而在這個過程中,我們也會需要取得當下的 Function Name 與 Class Name,來方便我們對 Exception 的追蹤及分析。

那麼,如何輕鬆地取得這些資訊呢?在 C# 中,我們可以使用 StackFrame 與 MethodBase 兩個類別來實現這個功能。

 

StackFrame 類別提供了堆疊框架的資訊,可以透過這個類別來取得當前呼叫的函式的相關資訊,包括函式名稱、函式所屬的類別名稱、行數等等。而 MethodBase 類別則提供了更多函式相關的資訊,包括函式名稱、函式所屬的類別名稱、函式參數資訊、函式修飾子等等。

接下來,我們舉個例子來說明如何使用 StackFrame 取得當前 Function Name 與 Class Name:

public static void LogException(Exception ex)
{
    var st = new StackTrace(ex, true);
    var frame = st.GetFrame(0);
    var className = frame.GetMethod().DeclaringType.FullName;
    var methodName = frame.GetMethod().Name;

    Console.WriteLine($"Class Name: {className}");
    Console.WriteLine($"Function Name: {methodName}");
}

在這個範例中,我們先建立一個叫做 StackTrace 的物件,將發生的 Exception 傳入,透過這個物件,我們可以取得當前 Function 的 StackFrame,StackFrame 是 Function 的呼叫堆疊中的一個元素,它記錄了 Function 的一些資訊,例如 Function 名稱、類別名稱、檔案名稱、行數等等。

接著,透過 StackFrame 物件的 GetMethod() 方法,我們可以取得當前 Function 所屬的 MethodBase 物件,MethodBase 物件包含了很多有用的資訊,例如 Function 的名稱、類別名稱、參數等等。

我們可以透過 MethodBase 的 DeclaringType 屬性,取得 Function 所屬的類別名稱,透過 Name 屬性,取得 Function 名稱。這樣,我們就可以方便地取得當前 Function 與 Class 的名稱,並將這些資訊紀錄在 Exception Log 中,以便日後查詢與除錯。

如果你需要更多函式相關的資訊,可以使用 MethodBase 類別來取得,以下是一個範例:

public static void LogException(Exception ex)
{
    var methodName = MethodBase.GetCurrentMethod().Name;
    var className = MethodBase.GetCurrentMethod().DeclaringType.FullName;

    Console.WriteLine($"Class Name: {className}");
    Console.WriteLine($"Function Name: {methodName}");
}

當前的範例中,我們使用了 MethodBase 的 GetCurrentMethod() 方法來取得當前 Function 的 MethodBase 實例。透過這個實例的 Name 屬性,我們就可以輕鬆取得 Function 名稱。同樣的,MethodBase 的 DeclaringType 屬性可以取得當前 Function 所在的 Class Type。

在使用 MethodBase 取得 Function 名稱和 Class Type 的時候,我們需要注意一些細節。例如,如果我們的 Function 是一個泛型方法,那麼取得的 MethodBase 實例的 Name 屬性會包含泛型資訊。在這種情況下,我們需要對取得的 Function 名稱進行進一步的處理,以去除不需要的部分。

總體來說,透過 MethodBase 取得 Function 名稱和 Class Type 是一個簡單且有效的方式,可以在開發過程中大大提高效率和準確性。

以下是一個使用 StackFrame 與 MethodBase 的簡單範例:

public static void LogException(Exception ex)
{
    var stackTrace = new StackTrace(ex, true);
    var frame = stackTrace.GetFrame(0);
    var method = frame.GetMethod();
    var className = method.DeclaringType.Name;
    var functionName = method.Name;
    
    // 在此處紀錄 Exception Log
    Console.WriteLine($"Exception occurred in {className}.{functionName}: {ex.Message}");
}

這個範例中,我們透過 StackTrace 取得 Exception 的 StackTrace,再透過 GetFrame(0) 取得最上層 StackFrame,然後透過 GetMethod() 取得 Function 的 MethodBase 實例,最後透過 Name 屬性取得 Function 名稱,以及 DeclaringType 屬性取得 Class Type。透過這個範例,我們可以更容易地紀錄 Exception Log,並在之後快速定位問題。

當然,我們也要注意使用情境。在極端的效能要求下,可能需要考慮使用更快速的方式來取得 Function Name 與 Class Name。在這種情況下,我們可以透過手動傳入 Function Name 與 Class Name 的方式,來達到更好的效能。但一般情況下,透過 StackFrame 與 MethodBase 是相當方便且實用的方法。

希望這篇文章能夠幫助您更好地理解如何取得當下 Function Name 與 Class Name,並且如何適當地使用 StackFrame 與 MethodBase。

Feat. Chat Gpt

如有指正之處,歡迎隨時提出