2
try
{
}
catch (Exception objEx)
{
    clsLog.blnLogError(this.GetType().Name, MethodBase.GetCurrentMethod().Name, String.Format("Error In {0}...", MethodBase.GetCurrentMethod().Name), objEx.Message);
}

这是我的代码,我需要类似的东西。

catch (MyException objEx)
{
}

class MyException
{
    method()
    {
        //method overload with necessary parameters.
        clsLog.blnLogError(this.GetType().Name, MethodBase.GetCurrentMethod().Name, String.Format("Error In {0}...", MethodBase.GetCurrentMethod().Name), objEx.Message);
    }
}

在那个异常类中,我需要获取当前的类名和方法名,而不是每次都写。

如何做到这一点?

更新

[Serializable]
public class MyException : Exception
{
    public MyException(string message, Exception innerException, object obj)
        : base(message, innerException)
    {
    }
}
try
{
    int f = int.Parse("d");
}
catch (MyException objEx)
{
}

它没有捕获异常,我需要方法名称,它引发错误的类名称。

4

1 回答 1

7

这不能通过继承来完成,您将需要编写一个扩展方法,以便您可以在所有异常类型上调用您的日志记录方法,无论它们是否由您自己声明。

要创建扩展方法,请创建一个包含静态方法的静态类来完成您的工作。在方法的第一个参数前面加上关键字this,向编译器表明该方法可以像第一个参数类型的对象(在您的情况下Exception)上的成员方法一样调用:

public static class ExceptionExtensions
{
    public static void Log(this Exception ex)
    {
        var stackTrace = new StackTrace();
        var callingMethod = stackTrace.GetFrame(1).GetMethod();
        var methodName = callingMethod.Name;
        var className = callingMethod.DeclaringType.Name;
        clsLog.blnLogError(className, methodName, string.Format("Error In {0}...", methodName), ex.Message);
    }
}

然后您可以在每个异常上调用该方法:

try
{
    int f = int.Parse("d");
}
catch(Exception ex)
{
    ex.Log();
}

有关扩展方法的更多信息,请参阅C# 编程指南

于 2013-10-21T15:14:52.570 回答