我维护的应用程序在应用程序发生错误时向我发送电子邮件。我将堆栈跟踪转储到电子邮件中,似乎工作正常。唯一缺少的是变量的值。我得到了所有的调用等等,从来没有任何变量。为了将这些变量值转储到电子邮件中,我还缺少什么?
以下是我用来将其转储到电子邮件中的代码:
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());
以下是电子邮件中的结果:
消息:指定的强制转换无效。来源:MyApplication目标站点:Void FindFormAndActivate(MyApplication.MDIParentForm,System.String,System.Object)堆栈跟踪:at MyApplication.UtilityClass.FindFormAndActivate(MDIParentForm frmMDIParentForm,String formName,Object parameter) at MyApplication.DashboardAlerts.NavigateToAssignment() at MyApplication.DashboardAlerts.utAlerts_MouseClick(Object sender,MouseEventArgs e) 在System.Windows.Forms.Control.OnMouseClick(MouseEventArgs e) 在System.Windows.Forms.Control.WmMouseUp(消息& m,MouseButtons按钮,Int32点击) 在System.Windows.Forms.Control.WndProc(消息& m) 在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)
修改
有些答案建议我自己将变量值添加到电子邮件中。我怎么会得到这些价值呢?发送电子邮件的此代码段不在失败的方法中。这是在发生异常时运行的代码。如果没有处理和纠正异常,我会让它冒泡到线程的顶部la Application.ThreadException += new ThreadExceptionEventHandler(HandleError);
,而HandleError
方法就是调用此电子邮件的方法。它不知道引起异常的方法的变量或参数是什么。
答案 0 :(得分:3)
StackTrace
属性只是异常发生时的调用图。如果您对任意局部变量的状态感兴趣,则必须在异常处理程序中将它们自己添加到电子邮件中。
更新:如果您想通过一系列异常来传递变量值,那么当您在适当的范围内捕获它们时,您必须将它们插入到异常中(即在消息中)。
答案 1 :(得分:3)
不要试图将它们放入堆栈跟踪中,只需将它们添加到您要发送的字符串中即可。
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());
由于电子邮件是在变量范围之外发送的,因此当它们在范围内时,您需要收集它们并将它们添加到抛出的异常中。我担心我对ThreadException
对象了解不多,但我会创建一个包含这些变量值的自定义异常。您将无法自动将它们添加到堆栈跟踪中;这不是真正的意义所在。所以,脱离我的头脑:
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
属性中保留原始异常的事实应该(希望)也保留原始堆栈跟踪。