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

5

我维护一个应用程序,当应用程序出现错误时会向我发送电子邮件。我将堆栈跟踪转储到电子邮件中,这似乎可以正常工作。唯一缺少的是变量的值。我可以获取所有调用等信息,但从未获取过任何变量。为了在电子邮件中转储变量值,我需要做什么?

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

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) 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) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

编辑

一些答案建议我在邮件中自己添加变量值。但是,我应该如何获取这些值呢?发送电子邮件的代码片段不在发生错误的方法中。这是任何异常发生时运行的代码。如果异常没有被处理和纠正,我会让它冒泡到线程的顶部,类似于 Application.ThreadException += new ThreadExceptionEventHandler(HandleError); 并且 HandleError 方法是进行此邮件调用的方法。它不知道导致异常的方法的变量或参数是什么。


请参见:https://dev59.com/WHVC5IYBdhLWcg3w4VRz - user423430
2个回答

3
StackTrace属性仅是异常发生时的调用图。如果您对任意本地变量的状态感兴趣,您需要在异常处理程序中自行添加它们到电子邮件中。 更新:如果您想通过一系列的异常传递变量值,您需要在适当的作用域捕获它们并将它们插入到异常中(即在消息中)。

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属性中,您可以保留原始堆栈跟踪。(希望如此)


@Richard - 现在事情就变得复杂了。你需要在抛出异常的地方访问这些变量,并且我会创建一个专门的异常类来传递它们。我会进行编辑。 - Justin Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接