2009-03-27 5 views
17

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

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

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

Как этот код даже скомпилирован? –

+5

Это не я просто сделал это, чтобы показать в качестве примера – Crash893

+0

Возможный дубликат http://stackoverflow.com/questions/8338495/how-to-get-error-line-number-of-code-using-try-catch –

ответ

44

Используйте ex.ToString(), чтобы получить полную трассировку стека.

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

+3

+1 для файлов PDB и номеров строк –

+1

Если это веб-проект и вы хотите развернуть pdbs на сервере - в параметрах проекта в разделе «Пакет/Публикация» снимите флажок «Исключить сгенерированные символы отладки». –

+0

Может ли кто-нибудь дать пояснения о «компиляции с помощью отладочных символов»? Мой проект имеет «Определить константу DEBUG», «Определить константу TRACE» и «Debug info: full», и я не получаю номера строк. MSDN говорит: «Нажмите вкладку« Сборка »в левой панели страницы свойств, затем установите флажки для параметров компилятора, которые вы хотите включить. Снимите флажки для параметров, которые вы хотите отключить». Полезный. – omJohn8372

4

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

25

Чтобы увидеть StackTrace для данного исключения, используйте 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.

+0

Зачем вам получать первый стек кадров? Разве вас не интересовал бы последний стек кадров? то есть StackFrame frame = st.GetFrame (st.FrameCount - 1) –

+0

Я попытался использовать это в веб-службе WCF, и номер строки, который он возвращает, всегда равен 0. Это находится в режиме отладки с присутствующим файлом .pdb. –

1
string lineNumber=e.StackTrace.Substring(e.StackTrace.Length - 7, 7); 
Смежные вопросы