Как перехватить трассировку стека? - PullRequest
4 голосов
/ 10 февраля 2012

Иногда я создаю экземпляр Exception, не выбрасывая его (например, чтобы передать его непосредственно обработчику).

OnException(new AuthorizationException());

Как инициализировать трассировку стека с текущим местоположением?

Ответы [ 3 ]

4 голосов
/ 10 февраля 2012

Вы можете использовать Environment.StackTrace свойство или использовать StackTrace класс:

var stack = new StackTrace();
var data = stack.<whatever you need from it>

Но я просто должен добавить: то, что вы делаете, ОЧЕНЬ плохо в концептуальном плане.

3 голосов
/ 10 августа 2012

Вы на самом деле задаете два разных вопроса (один в заголовке, другой в конце).

«Как записать трассировку стека?»

Просто запросите 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), даже на те, где на самом деле не было ошибок. Это вводит в заблуждение и его следует избегать.

0 голосов
/ 10 февраля 2012

Вы можете получить текущую трассировку стека в виде строки:

http://msdn.microsoft.com/en-us/library/system.environment.stacktrace.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...