如何创建可在 C# 中的任何异常上执行的方法

本文关键字:任何 异常 方法 执行 何创建 创建 | 更新日期: 2023-09-27 18:36:20

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)
{
}

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

如何创建可在 C# 中的任何异常上执行的方法

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

若要创建扩展方法,请创建一个静态类,其中包含执行工作的静态方法。在方法的第一个参数前面加上关键字 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# 编程指南。