Как получить историю вызовов метода? - PullRequest
0 голосов
/ 07 апреля 2009

Я пытаюсь получить список вызовов, сделанных от начала блока try, до исключения. В приведенном ниже коде, когда я попадаю в блок Catch, StackTrace в объекте Exception выглядит следующим образом:

в ConsoleApplication.Program.MethodC () / в ConsoleApplication.Program.Main (String [] args).

Это вполне ожидаемо, но не помогает мне узнать историю звонков. У кого-нибудь есть идеи о том, как я могу это сделать?

static void MethodA() { }
static void MethodB() { }
static void MethodC() { throw new Exception(); }

static void Main(string[] args)
{
    try
    {
        MethodA();
        MethodB();
        MethodC();
    }
    catch (Exception e)
    {
        // Get list of calls
        throw;
    }
}

Я был удивлен, увидев, что свойство StackTrace объекта Exception не является объектом StackTrace. Есть ли причина для этого?

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

Ответы [ 3 ]

1 голос
/ 07 апреля 2009

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

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

0 голосов
/ 07 апреля 2009

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

0 голосов
/ 07 апреля 2009

Похоже, вы не сможете получить трассировку стека для каждого метода, вызываемого с помощью блока try, если вы не добавите пользовательский код регистрации для каждого метода. Однако вы можете легко создать опцию System.Diagnostics.StackTrace из исключения, просто передав объект Exception в конструктор. Это сделает доступной всю информацию о трассировке стека, в том числе о том, было ли выброшено исключение из MethodA / MethodB / MethodC, что может быть по крайней мере несколько полезным для вас.

Пример кода:

static void MethodA() { }
static void MethodB() { }
static void MethodC() { throw new Exception(); }

static void Main(string[] args)
{
    try
    {
        MethodA();
        MethodB();
        MethodC();
    }
    catch (Exception e)
    {
        System.Diagnostics.StackTrace callStack = new System.Diagnostics.StackTrace(e);
        System.Diagnostics.StackFrame frame = null;
        System.Reflection.MethodBase calledMethod = null;
        System.Reflection.ParameterInfo[] passedParams = null;
        for (int x = 0; x < callStack.FrameCount; x++)
        {
            callStack.GetFrame(x);
            calledMethod = frame.GetMethod();
            passedParams = calledMethod.GetParameters();
            foreach (System.Reflection.ParameterInfo param in passedParams)
                System.Console.WriteLine(param.ToString());
        }
    }
}

(Вы можете увидеть этот поток SO для оригинального ответа, содержащего код. Я только слегка его изменил.)

Надеюсь, это хотя бы частичное решение вашего вопроса.

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