2016-09-29 4 views
0

Я пробовал несколько советов о том, как сохранить правильный номер строки в трассировке стека при выбросе исключения. Наиболее распространенным является просто ловить и бросать, но это не работает. Вот несколько, которые я пробовал:уловка/выброс трассировки стека линии номер ошибки

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     test(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 
private void test() 
{ 
    try 
    { 
     int a = 1; 
     int b = 0; 
     int x = 0; 
     x = a/b; 
    } 
    catch 
    { 
     throw; 
    } 
} 

И несколько вариантов блокировки.

catch (Exception) 
{ 
    throw; 
} 

catch (Exception e) 
{ 
    throw; 
} 

catch (Exception e) 
{ 
    throw e; 
} 

Все эти ошибки отчета о броске и окно сообщения линии - никогда на линии, которая делит на 0. Если я нарушу внутри функции теста(), он показывает правильную строка #, но после бросается нет. Единственный способ, с которым работал, - не иметь попыток/улов в функции test(). Но, конечно, я хочу, чтобы улавливать ошибки и повторно бросать их и правильно отслеживать трассировку стека. Итак, как это делается?

спасибо.

+0

'throw new Exception (" See InnerException ", ex);' улавливатель может посмотреть на свойство InnerException пойманного исключения, чтобы увидеть исходную стеклу и т. Д. –

+0

http://stackoverflow.com/questions/22623/best- практики-для-ловить-и-re-throw-net-exceptions – hatchet

+0

Фактически ближе к http://stackoverflow.com/questions/57383/in-c-how-can-i-rethrow-innerexception-without-losing-stack -trace ... но удивленный 'ExceptionDispatchInfo' только упоминается комментарием в том, что один @hatchet. – TylerY86

ответ

0

В момент выпуска у вас не будет номера строки, поскольку номер строки извлекается из файла *.pdb, который содержит все символы компиляции.
Итак, если вы планируете получить точный номер строки в выпуске/выпуске, вам нужно скопировать файл pdb

0

Самый простой способ - просто удалить try catch в тесте. Если это не вариант, как указано в комментарии выше, вы можете создать новое исключение, переходящее в старое исключение и искать внутреннее исключение для фактической информации о трассировке стека.

private void button1_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     test(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.InnerException.ToString()); 
    } 
} 

public void test() 
{ 
    try 
    { 
     int a = 1; 
     int b = 0; 
     int x = 0; 
     x = a/b; 
    } 
    catch (Exception e) 
    { 
     throw new Exception("inner exception", e); 
    } 
} 
0

Ответ TylerY86 работал для меня. Это дает много дополнительных вещей, поскольку ошибка пузырится вверх, но она дает правильную строку #.

Спасибо!

Смежные вопросы