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

C# 如何在堆栈跟踪转储中获取变量值?,c#,.net,variables,stack-trace,C#,.net,Variables,Stack Trace,我维护一个应用程序,当应用程序中发生错误时,它会向我发送电子邮件。我将堆栈跟踪转储到电子邮件中,它似乎工作正常。唯一缺少的是变量的值。我得到了所有的电话等等,只是从来没有任何变量。为了将这些变量值也转储到电子邮件中,我遗漏了什么 下面是我用来将其转储到电子邮件中的代码: UtilityClass.SendEmail(shortNTID, "admin@mydomain.com", new string[]

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

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

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\u鼠标单击(对象发送器,鼠标指针) 在System.Windows.Forms.Control.OnMouseClick(MouseEventArgs e)上 在System.Windows.Forms.Control.WmMouseUp(Message&m、MouseButtons按钮、Int32单击) 位于System.Windows.Forms.Control.WndProc(Message&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)中

编辑


一些答案建议我自己将变量值添加到电子邮件中。但是我如何获得这些值呢?发送电子邮件的这段代码不在失败的方法中。这是在发生异常时运行的代码。如果没有处理和纠正异常,我会让它冒泡到线程的顶部a la
Application.ThreadException+=newthreadexceptioneventhandler(HandleError)
HandleError
方法是进行此电子邮件呼叫的方法。它不知道导致异常的方法的变量或参数是什么。

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


更新:如果要通过异常链传递变量值,则必须在适当范围内捕获异常时将其插入异常(即消息中)

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

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-现在这将使事情变得复杂。您需要在抛出异常时访问变量,我将创建一个专门的异常类来传递它们。我将编辑。另请参见: