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

這是我的代碼,我需要類似的東西。如何創建一個可以在C#中執行任何異常的方法?

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

在那個異常類中,我需要得到類名和方法名,而不是每次寫入。

如何實現這一目標?

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

它不捕捉異常,我需要的方法名稱,一個地方,它拋出錯誤的類名。

+2

您必須從'Exception'派生'MyException'。 –

+0

如果我明白你想要做什麼,它不會起作用:'method'中的當前類名將是'MyException',而方法名將是'method'。 – dasblinkenlight

+0

我搜索了。我對.Net陌生,我沒有得到正確的。谷歌並沒有陷入困境。 :( – shanmugharaj

回答

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# Programming Guide

相關問題