【问题标题】:How do I get variable values in my stack trace dump?如何在堆栈跟踪转储中获取变量值?
【发布时间】:2011-06-02 19:54:48
【问题描述】:

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

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

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) 堆栈跟踪:在 MyApplication.UtilityClass.FindFormAndActivate(MDIParentForm frmMDIParentForm, String formName, Object 参数) 在 MyApplication.DashboardAlerts.NavigateToAssignment() 在 MyApplication.DashboardAlerts.utAlerts_MouseClick(对象发送者,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(消息& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息和 m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

编辑

一些答案​​建议我自己将变量值添加到电子邮件中。我将如何获得这些值?发送电子邮件的这个 sn-p 代码不在失败的方法中。这是在发生异常时运行的代码。如果异常没有得到处理和纠正,我让它冒泡到线程的顶部,就像Application.ThreadException += new ThreadExceptionEventHandler(HandleError);HandleError 方法是进行此电子邮件调用的方法。它不知道导致异常的方法的变量或参数是什么。

【问题讨论】:

标签: c# .net variables stack-trace


【解决方案1】:

不要试图将它们放在堆栈跟踪中,只需将它们添加到您正在发送的字符串中。

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

【讨论】:

  • @Richard - 现在这会使事情复杂化。您将需要在抛出异常时访问变量,并且我将创建一个专门的异常类来传递它们。我会编辑。
【解决方案2】:

StackTrace 属性只是发生异常时的调用图。如果您对任意局部变量的状态感兴趣,您必须自己在异常处理程序中将它们添加到电子邮件中。

更新:如果你想通过一系列异常传递变量值,你必须在适当的范围内捕获它时将它们插入到异常中(即在消息中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 2022-01-02
    • 2010-10-11
    • 2010-09-11
    • 2010-12-06
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多