我正在为try/catch语句创建一个简单的日志记录方法(没什么花哨的)。我要包括类名称和引发异常的方法。

有两种获取信息的方法。一种使用MethodBase.GetCurrentMethod()和异常TargetSite

我知道MethodBase可能会增加性能问题,但是对于常规try/catch语句而言,这是微不足道的。

我也明白两者都可以具有空值。我的问题是,哪个过程更可取,有什么缺点吗?

这是我的代码

public static void LogError(Exception exp, MethodBase method)
{
    var methodName = method.Name;
    var className = (method.ReflectedType != null) ? method.ReflectedType.Name : "";

    var methodName2 = exp.TargetSite!= null ? exp.TargetSite.Name : "";
    var className2 = (exp.TargetSite != null && exp.TargetSite.DeclaringType != null) ? exp.TargetSite.DeclaringType.Name : "";

    // do more stuff
}

这是方法的调用
AuditDbContext.LogError(ex, MethodBase.GetCurrentMethod());

如果我使用TargetSite,则不会传入MethodBase(当然)。

更新:

包括 call 者信息作为其他可能的选择。感谢lliar的评论。

最佳答案

如果要记录抛出异常的类名和方法名,则应使用Exception.TargetSite
MethodBase.GetCurrentMethod()返回当前方法。此方法可以返回与引发异常的方法不同的方法。

这是显示差异的示例:

public static void Main()
{
    try
    {
        Demo();
    }
    catch (Exception e)
    {
        // Output: Program Demo
        Log1(e);

        // Output: Program Main
        Log2(e, MethodBase.GetCurrentMethod());
    }
}

public static void Demo()
{
    // Exception is thrown in Program.Demo
    throw new Exception();
}

public static void Log1(Exception exp)
{
    var methodName = exp.TargetSite != null ? exp.TargetSite.Name : "";
    var className = (exp.TargetSite != null && exp.TargetSite.DeclaringType != null) ? exp.TargetSite.DeclaringType.Name : "";
    Console.WriteLine("{0} {1}", className, methodName);
}

public static void Log2(Exception exp, MethodBase method)
{
    var methodName = method.Name;
    var className = (method.ReflectedType != null) ? method.ReflectedType.Name : "";
    Console.WriteLine("{0} {1}", className, methodName);
}

08-04 10:16