[英]How do I get variable values in my stack trace dump?
我維護一個應用程序,當應用程序發生錯誤時,它會向我發送 email。 我將堆棧跟蹤轉儲到 email 中,它似乎工作正常。 唯一缺少的是變量的值。 我接到所有的電話等等,從來沒有任何變量。 為了將這些變量值也轉儲到 email 中,我還缺少什么?
下面是我用來將其轉儲到 email 的代碼:
UtilityClass.SendEmail(shortNTID,
"admin@mydomain.com",
new string[] { "support@mydomain.com" },
"MyApplication error has occured for user: " +
shortNTID + " (Main).",
"Message: " + ex.Message.ToString() +
" Source: " + ex.Source.ToString() +
" Target Site: " + ex.TargetSite.ToString() +
" Stack Trace: " + ex.StackTrace.ToString());
這是 email 中的結果:
消息:指定的強制轉換無效。 來源:MyApplication 目標站點:Void FindFormAndActivate(MyApplication.MDIParentForm, System.String, System.Object) 堆棧跟蹤:在 MyApplication.DashboardAlerts.NavigateToAssignment() 在 MyApplication.UtilityClass.FindFormAndActivate(MDIParentForm frmMDIParentForm, String formName, Object 參數) .DashboardAlerts.utAlerts_MouseClick(Object sender, MouseEventArgs e) at System.Windows.Forms.Control.OnMouseClick(MouseEventArgs e) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows. Forms.Control.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms .Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
編輯
一些答案建議我自己將變量值添加到 email 中。 我將如何獲得這些值? 發送 email 的這段代碼不在失敗的方法中。 這是在發生異常時運行的代碼。 如果異常沒有得到處理和糾正,我讓它冒泡到線程的頂部,例如Application.ThreadException += new ThreadExceptionEventHandler(HandleError);
HandleError
方法是進行此 email 調用的方法。 它不知道導致異常的方法的變量或參數是什么。
StackTrace
屬性只是發生異常時的調用圖。 如果您對任意局部變量的 state 感興趣,您必須自己在異常處理程序中將它們添加到 email 中。
更新:如果你想通過一系列異常來傳遞變量值,當你在適當的 scope 中捕獲它時,你必須將它們插入到異常中(即在消息中)。
與其嘗試將它們放在堆棧跟蹤中,不如將它們添加到您發送的字符串中。
UtilityClass.SendEmail(shortNTID,
"admin@mydomain.com",
new string[] { "support@mydomain.com" },
"MyApplication error has occured for user: " +
shortNTID + " (Main).",
"Message: " + ex.Message.ToString() +
" Source: " + ex.Source.ToString() +
" Target Site: " + ex.TargetSite.ToString() +
" Stack Trace: " + ex.StackTrace.ToString() +
" MyVar1 Value: " + MyVar1.ToString() +
" MyVar2 Value: " + MyVar2.ToString() +
" MyVar3 Value: " + MyVar3.ToString());
由於 email 是在變量 scope 之外發送的,因此當它們在 scope 中時,您需要收集它們並將它們添加到拋出的異常中。 恐怕我對ThreadException
object 了解不多,但我會創建一個自定義異常來保存這些變量的值。 您將無法自動將它們添加到堆棧跟蹤中; 那不是它的真正用途。 所以,在我的腦海中:
public class CustomException : Exception
{
public string MyVar1 { get; private set; }
public string MyVar2 { get; private set; }
public Exception OriginalException { get; private set; }
public CustomException(Exception original, string myVar1, string myVar2)
{
MyVar1 = myVar1;
MyVar2 = myVar2;
OriginalException = original;
}
}
稍后,深入您的代碼:
try
{
//code that might throw exceptions
}
catch (Exception e)
{
throw new CustomException(e, myVar1, myVar2);
}
通過將原始異常保留在OriginalException
屬性中來保留原始異常這一事實應該(希望)也保留原始堆棧跟蹤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.