C#获取类名:异常TargetSite.DeclaringType.Name Vs MethodBase.GetCurrentMethod().DeclaringType

C#获取类名:异常TargetSite.DeclaringType.Name Vs MethodBase.GetCurrentMethod().DeclaringType,c#,exception,error-handling,C#,Exception,Error Handling,我正在为try/catch语句创建一个简单的日志记录方法(没有什么特别之处)。我想包括引发异常的类名和方法 获取信息有两种不同的方式。一个使用MethodBase.GetCurrentMethod()和异常TargetSite 我知道MethodBase可能会增加一个性能问题,但对于常规的try/catch语句来说,这是非常无关紧要的 我也知道两者都可能有空值。我的问题是哪个流程更可取,是否有任何负面影响,或者它是否重要 这是我的代码,两者都有 public static void LogErr

我正在为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

更新:


将呼叫者信息作为额外的可能选择。感谢lliar的评论。

对我来说,最好的方法是创建Stacktrace并从中获取方法名。这是我使用的方法:
如果您想查看我用于日志记录的整个类,请告诉我




如果要将类名称和方法名称记录在引发异常的位置,则应使用
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);
}

是否要记录引发异常的方法(不一定是try/catch所在的位置)或捕获异常的位置?这就是你应该使用的东西。我想抓住它的例外情况。你考虑使用吗?参见示例:.@ZombieCode您最终使用了什么方法来获取
类名
?@IliarTurdushev我最终使用了TargetSite的异常数据。这更简单、更合理,因为我不必传递额外的参数,也不必包含
系统。反射
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);
}