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