Показывать номер строки в обработке исключений - PullRequest
19 голосов
/ 27 марта 2009

Как можно отобразить, какой номер строки вызвал ошибку, и возможно ли это даже при том, как .NET компилирует свои .exes?

Если нет, то есть ли для Exception.Message автоматизированный способ показать сабвуфер, который вырубился?

try
{
  int x = textbox1.Text;
}
catch(Exception ex)
{
     MessageBox.Show(ex.Message);
}

Ответы [ 4 ]

46 голосов
/ 27 марта 2009

Используйте ex.ToString() для получения полной трассировки стека.

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

29 голосов
/ 06 августа 2010

Чтобы увидеть трассировку стека для данного исключения, используйте e.StackTrace

Если вам нужна более подробная информация, вы можете использовать класс System.Diagnostics.StackTrace (вот код, который вы можете попробовать):

try
{
    throw new Exception();
}
catch (Exception ex)
{
    //Get a StackTrace object for the exception
    StackTrace st = new StackTrace(ex, true);

    //Get the first stack frame
    StackFrame frame = st.GetFrame(0);

    //Get the file name
    string fileName = frame.GetFileName();

    //Get the method name
    string methodName = frame.GetMethod().Name;

    //Get the line number from the stack frame
    int line = frame.GetFileLineNumber();

    //Get the column number
    int col = frame.GetFileColumnNumber();
}

Это будет работать, только если для сборки доступен файл pdb. См. Свойства проекта - вкладка «Сборка» - «Дополнительно» - «Отладочная информация», чтобы убедиться в наличии файла pdb.

4 голосов
/ 27 марта 2009

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

1 голос
/ 20 декабря 2014
string lineNumber=e.StackTrace.Substring(e.StackTrace.Length - 7, 7);
...