Определение того, какая строка кода вызвала исключение - PullRequest
6 голосов
/ 29 июня 2009

В dotNet строка выдает исключение и ловится, как я могу определить, какая строка в каком файле вызвала исключение? Кажется относительно простым, но я не могу понять ...

Ответы [ 4 ]

6 голосов
/ 29 июня 2009

Вы можете сделать это, только если у вас есть отладочные символы.

catch(Exception ex) {
    // check the ex.StackTrace property
}

Если вы хотите отладить такую ​​ситуацию в VS, вам лучше просто установить флажок Thrown для Common Language Runtime Exceptions в диалоге Exceptions, расположенном в меню Debug. Отладчик сломается, как только будет сгенерировано исключение, даже если оно находится в блоке try.

2 голосов
/ 29 июня 2009

Лично я просто регистрирую возвращаемое значение исключения ToString (). Вся трассировка стека включена. Это одна строка кода ... очень просто.

1 голос
/ 29 июня 2009

Ну, в .NET у вас есть то, что называется FirstChanceException. По сути, они выбрасываются до обработки исключения. Есть два способа взглянуть на проблему, которую вы здесь представляете. Один с точки зрения отладки. При отладке вы можете просто настроить отладчик так, чтобы он перехватывал выброшенные исключения из окна «Отладка / Исключения». Это проще в интерактивном контексте. Если вам нужно записать эту информацию в неинтерактивном контексте, я бы сделал нечто похожее на то, о чем говорит CMS ...

try
{
    ...
}
catch(Exception ex)
{
    System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(ex);
    System.Diagnostics.StackFrame firstFrame = stackTrace.GetFrame[0];
    Console.WriteLine(firstFrame.GetFileLineNumber);
    ...
}

Единственное отличие состоит в том, что мы получаем всю трассировку стека, а затем переходим к первому кадру, в который первоначально было сгенерировано исключение.

1 голос
/ 29 июня 2009

Вы можете использовать StackFrame Class :

try
{
    ...
    ...

}
catch(...)
{
    StackFrame sf = new StackFrame(true);

    int lineNumber = sf.GetFileLineNumber();
    int colNumber = sf.GetFileColumnNumber();
    string fileName = sf.GetFileName();
    string methodName = sf.GetMethod().Name;
}
...