В .net Exception, как получить stacktrace со значениями аргументов

setTimeout(setColor('yellow'),6000);

Вы вызываете setColor('yellow') и передаете возвращаемое значение (которое находится в undefined) на setTimeout.

Вам нужно передать ему функцию.


Также важно отметить, что setTimeout вызовет функцию после вызова через некоторое время. Это не заставляет JavaScript за этот период.

setTimeout(setColor.bind(window, 'yellow'),6000);
setTimeout(setColor.bind(window, 'red'),6000); 

... вызовет setTimeout в 0s, затем снова вызовет setTimeout через секунду, затем вызовет setColor('yellow') на 6s и setColor('red') - часть секунды после этого.

38
задан Caerbanog 2 October 2008 в 01:33
поделиться

10 ответов

К сожалению, Вы не можете получить фактические значения параметров от стека вызовов кроме со средствами отладки, на самом деле присоединенными к приложению. Однако при помощи StackTrace и StackFrame возражает в Системе. Диагностика можно обойти стек вызовов и считать все вызванные методы и названия параметра и типы. Вы сделали бы это как:

System.Diagnostics.StackTrace callStack = new System.Diagnostics.StackTrace();
System.Diagnostics.StackFrame frame = null;
System.Reflection.MethodBase calledMethod = null;
System.Reflection.ParameterInfo [] passedParams = null;
for (int x = 0; x < callStack.FrameCount; x++)
{
    frame = callStack.GetFrame(x);
    calledMethod = frame.GetMethod();
    passedParams = calledMethod.GetParameters();
    foreach (System.Reflection.ParameterInfo param in passedParams)
        System.Console.WriteLine(param.ToString()); 
}

при необходимости в фактических значениях тогда Вы собираетесь должны взять мини-дампы, и проанализировать их я боюсь. Информация о получении информации дампа может быть найдена в:

http://www.debuginfo.com/tools/clrdump.html

3
ответ дан hultqvist 7 July 2019 в 05:56
поделиться

Я не думаю Система. Диагностика. StackFrame предоставляет информацию аргумента (кроме сигнатуры метода).

Вы могли оснастить неприятные вызовы с трассировкой, регистрирующейся через AOP, или даже использовать его функции перехвата исключения для условного входа, не имея необходимость замусорить код. Взгляните [приблизительно 110] http://www.postsharp.org/ .

7
ответ дан user7375 7 July 2019 в 05:56
поделиться

теоретически возможно сделать то, что Вы хотите путем использования в своих интересах формата файла Портативного исполняемого файла (PE) для получения тип переменных и смещений, но я столкнулся [документация] со стеной, пытающейся сделать это несколько лет назад.Удачи!

1
ответ дан Steven A. Lowe 7 July 2019 в 05:56
поделиться

Я не полагаю, что существует встроенный механизм. Получение каждого кадра отслеживания стека, позволяя Вам определить метод в трассировке, только дает Вам отраженную информацию о типе о том методе. Никакая информация о параметре. Я думаю, что это то, почему некоторые исключения, особенно, ArgumentException, и. al. обеспечивают механизм для определения значения аргумента, вовлеченного в исключение, так как нет никакого простого способа получить его.

1
ответ дан Peter Meyer 7 July 2019 в 05:56
поделиться

Если Вы могли бы сделать то, что Вы ищете, Вы победили бы неотъемлемую часть безопасности.NET.

наилучший вариант в случае, это для присоединения к отладчику или профилировщику (любой из них может получить доступ к тем значениям). Первый может быть присоединен, последняя потребность быть активным, прежде чем программа запустится.

1
ответ дан leppie 7 July 2019 в 05:56
поделиться

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

0
ответ дан Kilhoffer 7 July 2019 в 05:56
поделиться

Как только у Вас есть исключение эти две вещи, которыми Вы интересуетесь, Система. Диагностика. StackTrace и Система. Диагностика. StackFrame

Там является примером MSDN здесь

0
ответ дан slf 7 July 2019 в 05:56
поделиться

Так как конечные пользователи являются разработчиками, можно предоставить им версию, которая позволяет регистрироваться всех ключевых значений/аргументов, которые передаются. И предоставьте услугу так, чтобы они могли повернуть вход включения - выключения.

1
ответ дан Vivek 7 July 2019 в 05:56
поделиться

Аналогично, я не нашел, что что-либо получает параметры автоматически во времени выполнения. Вместо этого я использовал дополнение Visual Studio для генерации кода что явно пакеты параметры, как это:

public class ExceptionHandler
{
    public static bool HandleException(Exception ex, IList<Param> parameters)
    {
        /*
         * Log the exception
         * 
         * Return true to rethrow the original exception,
         * else false
         */
    }
}

public class Param
{
    public string Name { get; set; }
    public object Value { get; set; }
}

public class MyClass
{
    public void RenderSomeText(int lineNumber, string text, RenderingContext context)
    {
        try
        {
            /*
             * Do some work
             */
            throw new ApplicationException("Something bad happened");
        }
        catch (Exception ex)
        {
            if (ExceptionHandler.HandleException(
                    ex, 
                    new List<Param>
                    {
                        new Param { Name = "lineNumber", Value=lineNumber },
                        new Param { Name = "text", Value=text },
                        new Param { Name = "context", Value=context}
                    }))
            {
                throw;
            }
        }
    }
}

РЕДАКТИРОВАНИЕ: или альтернативно, путем создания параметра к HandleException массивом параметров:

public static bool HandleException(Exception ex, params Param[] parameters)
{
   ...
}

...
if (ExceptionHandler.HandleException(
                    ex, 
                    new Param { Name = "lineNumber", Value=lineNumber },
                    new Param { Name = "text", Value=text },
                    new Param { Name = "context", Value=context}
                    ))
{
    throw;
}
...

Это - что-то вроде боли, генерирующей дополнительный код для явной передачи параметров обработчику исключений, но с использованием дополнения можно, по крайней мере, автоматизировать его.

пользовательский атрибут А может использоваться для аннотирования любых параметров, которые Вы не хотите, чтобы дополнение передало обработчику исключений:

public UserToken RegisterUser( string userId, [NoLog] string password )
{
}

2-Е РЕДАКТИРОВАНИЕ:

Мышление Вы, я полностью забыл о AVICode:

http://www.avicode.com/

Они используют методы перехвата вызова для обеспечения точно этого вида информации, таким образом, это должно быть возможно.

6
ответ дан Steve Morgan 7 July 2019 в 05:56
поделиться

Я не знаю способ получить значения аргументов каждой функции в трассировке стека вызовов, но одно решение состояло бы в том, чтобы поймать определенное исключение (KeyNotFoundException в Вашем примере) и повторно бросить его в новое Исключение. Это позволяет Вам, связывают любую дополнительную информацию, которой Вы желаете

, Например:

Dim sKey as String = "some-key"
Dim sValue as String = String.Empty

Try
   sValue = Dictionary(sKey)
Catch KeyEx As KeyNotFoundException
   Throw New KeyNotFoundException("Class.Function() - Couldn't find [" & sKey & "]", KeyEx)
End Try

я ценю Ваш оператор о локализации строк ошибки, но если Ваша аудитория является 'главным образом программистами' тогда, соглашение уже диктует понимание английского языка до некоторой степени (справедливо или неправильно - но это - другие дебаты!)

0
ответ дан Andrew 7 July 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: