簡體   English   中英

如何創建一個方法,而不是在C#中的任何異常上執行?

[英]How to create a method than can be executed on any exception in C#?

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

在那個異常類中,我需要獲取curent類名和方法名,而不是每次都寫。

怎么做到這一點?

UPDATE

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

它沒有捕獲異常,因此我需要方法名稱和引發錯誤的類名稱。

這不能通過繼承來完成,您需要編寫一個擴展方法,以便您可以在所有異常類型上調用您的日志記錄方法,無論它們是否是您自己聲明的。

要創建擴展方法,請創建一個包含執行工作的靜態方法的靜態類。 在前面添加關鍵字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#編程指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM