blockquote>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')
- часть секунды после этого.
К сожалению, Вы не можете получить фактические значения параметров от стека вызовов кроме со средствами отладки, на самом деле присоединенными к приложению. Однако при помощи 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());
}
при необходимости в фактических значениях тогда Вы собираетесь должны взять мини-дампы, и проанализировать их я боюсь. Информация о получении информации дампа может быть найдена в:
Я не думаю Система. Диагностика. StackFrame предоставляет информацию аргумента (кроме сигнатуры метода).
Вы могли оснастить неприятные вызовы с трассировкой, регистрирующейся через AOP, или даже использовать его функции перехвата исключения для условного входа, не имея необходимость замусорить код. Взгляните [приблизительно 110] http://www.postsharp.org/ .
теоретически возможно сделать то, что Вы хотите путем использования в своих интересах формата файла Портативного исполняемого файла (PE) для получения тип переменных и смещений, но я столкнулся [документация] со стеной, пытающейся сделать это несколько лет назад.Удачи!
Я не полагаю, что существует встроенный механизм. Получение каждого кадра отслеживания стека, позволяя Вам определить метод в трассировке, только дает Вам отраженную информацию о типе о том методе. Никакая информация о параметре. Я думаю, что это то, почему некоторые исключения, особенно, ArgumentException, и. al. обеспечивают механизм для определения значения аргумента, вовлеченного в исключение, так как нет никакого простого способа получить его.
Если Вы могли бы сделать то, что Вы ищете, Вы победили бы неотъемлемую часть безопасности.NET.
наилучший вариант в случае, это для присоединения к отладчику или профилировщику (любой из них может получить доступ к тем значениям). Первый может быть присоединен, последняя потребность быть активным, прежде чем программа запустится.
Я не знаю ни о чем как этот, но хотел его сам. Я обычно делаю это сам при выдавании исключения, но если это не Ваше для броска, затем можно отсутствовать с остальной частью нас.
Как только у Вас есть исключение эти две вещи, которыми Вы интересуетесь, Система. Диагностика. StackTrace и Система. Диагностика. StackFrame
Там является примером MSDN здесь
Так как конечные пользователи являются разработчиками, можно предоставить им версию, которая позволяет регистрироваться всех ключевых значений/аргументов, которые передаются. И предоставьте услугу так, чтобы они могли повернуть вход включения - выключения.
Аналогично, я не нашел, что что-либо получает параметры автоматически во времени выполнения. Вместо этого я использовал дополнение 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:
Они используют методы перехвата вызова для обеспечения точно этого вида информации, таким образом, это должно быть возможно.
Я не знаю способ получить значения аргументов каждой функции в трассировке стека вызовов, но одно решение состояло бы в том, чтобы поймать определенное исключение (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
я ценю Ваш оператор о локализации строк ошибки, но если Ваша аудитория является 'главным образом программистами' тогда, соглашение уже диктует понимание английского языка до некоторой степени (справедливо или неправильно - но это - другие дебаты!)