Как получить значения переменных в дампе трассировки стека? - PullRequest
5 голосов
/ 02 июня 2011

Я поддерживаю приложение, которое отправляет мне электронное письмо при возникновении ошибки в приложении.Я записываю трассировку стека в электронное письмо, и, похоже, все работает нормально.Не хватает только значений переменных.Я получаю все звонки и тому подобное, просто никогда никаких переменных.Чего мне не хватает для того, чтобы эти значения переменных также были сброшены в электронное письмо?

Ниже приведен код, который я использую для выгрузки этого сообщения в электронное письмо:

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 MyAppateAignateAgameAppateAignateApport) MyApplication.ind.Amping.Apport в MyApplication.ormApp.All)..DashboardAlerts.utAlerts_MouseClick (Отправитель объекта, MouseEventArgs e) в System.Windows.Forms.Control.OnMouseClick (MouseEventArgs e) в System.Windows.Forms.Control.WmMouseUp (кнопка Message & 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.Обратный вызов (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

РЕДАКТИРОВАТЬ

В некоторых ответах предлагается, чтобы я сам добавил значения переменных в электронное письмо,Как бы я получить эти значения, хотя?Этот фрагмент кода, который отправляет электронное письмо, не относится к методу, который не работает.Это код, который запускается каждый раз, когда возникает исключение.Если исключение не обработано и не исправлено, я позволю ему всплыть в верхнюю часть потока в стиле Application.ThreadException += new ThreadExceptionEventHandler(HandleError);, и именно метод HandleError выполняет этот вызов по электронной почте.Он не знает, какие переменные или параметры были для метода, вызвавшего исключение.

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Вместо того чтобы пытаться поместить их в трассировку стека, просто добавьте их в отправляемую строку.

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());

Edit:

Поскольку электронное письмо отправляется за пределы области видимости переменных, вам необходимо собрать их, когда они находятся в области видимости, и добавить их к создаваемому исключению. Боюсь, я мало что знаю об объекте 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, должен (мы надеемся) также сохранить исходный след стека.

3 голосов
/ 03 июня 2011

Свойство StackTrace - это просто граф вызовов в точке, где произошло исключение. Если вас интересует состояние произвольных локальных переменных, вам придется добавить их в электронное письмо самостоятельно в обработчике исключений.

Обновление: Если вы хотите передать значения переменных через цепочку исключений, вам придется вставить их в исключение (т. Е. В сообщение), когда вы поймаете его в соответствующей области.

...