2014-02-19 27 views
1

我製作了一個方法,將異常記錄到名爲Logs的文件夾中,並將其保存在文本文件中。文本輸出的格式是像這樣:在參數中傳遞類名/方法名,可能嗎?

Main thread has thrown an exception @ ClassName::MethodName : Exception.ToString(); 

ClassName::MethodName是應該包含哪些類和方法拋出它(在做任務)一文。怎麼可能通過這些論點?舉例來說,如果我有一個名爲「測試」類,而我有這樣的方法:

public void DoSomething() { 
    try { 
     this.Name = "Test"; 
    } catch (Exception e) { 
     MainForm.Instance.LogException(e); 
    } 

那麼,如果一個異常被拋出,參數Test::DoSomething將被傳遞和顯示。在C#中如何做到這一點?

回答

1

該例外有一個StackTrace屬性,它爲您提供了儘可能多的信息,以便引發異常。

+0

我怎麼能走類/方法名稱從StackTrace屬性? – user3265040

+0

@ user3265040看我的答案 –

2

你可以使用Reflection ..

public void DoSomething() { 
    try { 
     this.Name = "Test"; 
    } catch (Exception e) { 
     var method = System.Reflection.MethodBase.GetCurrentMethod(); 
     var methodName = method.Name; 
     var className = method.ReflectedType.Name; 
     MainForm.Instance.LogException(String.Format("{0} - {1}:{2}", className, methodName, e)); 
    } 
0

e.StackTrace.GetFrame(0)會給你最近StackFrame

鑑於此,e.StackTrace.GetFrame(0).GetMethod()會給你一個實例MethodBase,從這個例子中,你可以得到的方法名稱和類

1

您可以使用下面的代碼:

public static void DoSomething() 
     { 
      try 
      { 
       throw new InvalidOperationException("Exception"); 
      } 
      catch (Exception e) 
      { 
       StackTrace stackTrace = new StackTrace(); 

       StackFrame stackFrame = stackTrace.GetFrame(0); 

       Console.WriteLine("Class Name: {0}, Method Name: {1}", stackFrame.GetMethod().Module, stackFrame.GetMethod().Name); 


      } 
     }