如何在堆栈跟踪转储中获取变量值?

时间:2011-06-02 19:54:49

标签: c# .net variables stack-trace

我维护的应用程序在应用程序发生错误时向我发送电子邮件。我将堆栈跟踪转储到电子邮件中,似乎工作正常。唯一缺少的是变量的。我得到了所有的调用等等,从来没有任何变量。为了将这些变量值转储到电子邮件中,我还缺少什么?

以下是我用来将其转储到电子邮件中的代码:

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方法就是调用此电子邮件的方法。它不知道引起异常的方法的变量或参数是什么。

2 个答案:

答案 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属性中保留原始异常的事实应该(希望)也保留原始堆栈跟踪。