2012-03-20 59 views
17

發生異常時,如何獲取所有本地&會話變量的轉儲?我正在考慮編寫一些基於反射的函數,它會詢問調用函數&創建一個變量&值的轉儲。如何獲得所有本地變量的轉儲?

是否有我可以使用的現有庫?

UPDATE

說給同事後,我指着AOP或面向方面的編程。這是我的理解...使用AOP,可以簡單地裝飾具有某些屬性的類&。 AOP框架然後將代碼注入這些類或其周圍的代碼中。有兩種不同的框架,一種注入代碼&,然後編譯程序集&第二種簡單地使用反射&捕獲您已裝飾的調用,並在運行時在方法周圍包裝任何代碼。

我希望一切都有道理。我會在我的做法後對這個&做更多的研究。

謝謝你們......

+0

您正在使用哪個版本的Visual Studio? (如果有的話) – PedroC88 2012-03-20 15:05:20

+0

硬部分(局部變量)是Gregory A Beamer指出的http://stackoverflow.com/questions/362124/how-to-trace-all-local-variables-when-an-exception-occurs的副本出。 – 2012-03-20 16:10:57

+0

@ PedroC88 - 我正在使用VS 2010 pro – Skadoosh 2012-03-20 18:02:14

回答

11

我不確定這是不是你要找的。但是,如果你在一個catch塊是你可以得到這個類的所有字段和屬性通過以下方式:

try 
{ 
    double d = 1/0; 
} 
catch (Exception ex) 
{ 
    var trace = new System.Diagnostics.StackTrace(); 
    var frame = trace.GetFrame(1); 
    var methodName = frame.GetMethod().Name; 
    var properties = this.GetType().GetProperties(); 
    var fields = this.GetType().GetFields(); // public fields 
    // for example: 
    foreach (var prop in properties) 
    { 
     var value = prop.GetValue(this, null); 
    } 
    foreach (var field in fields) 
    { 
     var value = field.GetValue(this); 
    } 
    foreach (string key in Session) 
    { 
     var value = Session[key]; 
    } 
} 

我已經展示瞭如何獲取在異常發生只爲求方法名稱的完整性。

隨着BindingFlags你可以指定約束條件,比如你只希望這個類的屬性,而不是從繼承:

Using GetProperties() with BindingFlags.DeclaredOnly in .NET Reflection

當然上面應該給你只是一個起點如何手動做到這一點,你應該封裝所有成類。我從來沒有用過它,所以它沒有經過測試。

+1

'this.GetType()。GetProperties()'給出了150個屬性的列表,並且我在我的類中有1個屬性。爲什麼? – Pankaj 2012-03-20 15:14:32

+0

我的意思是,你如何區分哪些是150屬性中的罪魁禍首? – Pankaj 2012-03-20 15:19:46

+0

@PankajGarg:我不知道OP是否想要這150個屬性。您始終可以指定BindingFlags。 – 2012-03-20 15:28:29

-1

這是一個關於堆棧溢出的問題,雖然表達方式不同。在一個線程中,答案是use PostSharp。正如其他人建議dumping the stack trace,你可以做到這一點。最簡單的方法是手動轉儲局部變量。這可以是Trace,也可以創建自己的自定義異常處理程序。

1

您不應該在Try Catch表單中使用異常處理。相反,它應該是

  1. 頁面級錯誤
  2. 應用程序級的錯誤

假設你有一個表示層和業務邏輯層/數據訪問層。

在面對業務邏輯中的錯誤後,它將直接移至Application_Error事件下的Glogal.asax.cs文件,而無需返回調用函數。在這裏,您可以登錄該錯誤消息像下面....

HttpContext.Current.Server.GetLastError().InnerException.StackTrace 
HttpContext.Current.Server.GetLastError().InnerException.Message 
HttpContext.Current.Server.GetLastError().InnerException.Source 
HttpContext.Current.Server.GetLastError().InnerException.TargetSite.DeclaringType.FullName 
HttpContext.Current.Server.GetLastError().InnerException.TargetSite.DeclaringType.Name 
HttpContext.Current.Server.GetLastError().InnerException.TargetSite.DeclaringType.Namespace 

在頁面級錯誤的情況下,當務之急是頁面ONERROR覆蓋並最終應用層錯誤事件。這裏也可以記錄錯誤。

我更喜歡Application_error處理程序,因爲如果您有20個模塊,並且需要爲每個模塊創建基類時纔會出現這種情況。代碼冗餘並不好。

現在在Web配置中,您可以編寫代碼以在下面的某個默認頁面上重定向用戶。

<customErrors defaultRedirect="ErrorPage.htm" mode="On"> 
    <error statusCode="404" redirect="ErrorPageNotFound.htm"/> 
</customErrors>