Вы на самом деле задаете два разных вопроса (один в заголовке, другой в конце).
«Как записать трассировку стека?»
Просто запросите static System.Environment.StackTrace
свойство или через new System.Diagnostics.StackTrace();
.
Чтение этого свойства вовсе не требует создания объекта исключения, поэтому, возможно, это все, что вам нужно.
"Как инициализировать трассировку стека [объекта исключения] с текущим местоположением?"
Свойство StackTrace
объекта исключения не инициализируется, пока вы на самом деле не throw
объект исключения.
"Трассировка стека создается в момент выдачи исключения. Это отличается от Java, где трассировка стека создается во время создания объекта исключения [& hellip;]."
& Mdash; Стандарт общеязыковой инфраструктуры, аннотированный , гл. 18, стр. 301.
Поскольку это свойство только для чтения, вы не можете инициализировать его самостоятельно & mdash; если вы не получили свой собственный класс исключений:
// don't do that:
class ExceptionWithPresetStackTrace : System.Exception
{
public ExceptionWithPresetStackTrace(string stackTrace)
{
this.stackTrace = stackTrace;
}
public override string StackTrace
{
get
{
return stackTrace;
}
}
readonly string stackTrace;
}
В сочетании с ответом на первый вопрос вы можете сделать следующее:
OnException(new ExceptionWithPresetStackTrace(System.Environment.StackTrace));
Однако, как правило, это плохая идея, поскольку она позволяет создавать объекты исключений, которые указывают разработчику на любое случайное место (через свойство StackTrace
), даже на те, где на самом деле не было ошибок. Это вводит в заблуждение и его следует избегать.