Есть ли способ узнать, по какой строке было сгенерировано исключение? - PullRequest
3 голосов
/ 18 августа 2010

Скажите, у меня есть такой метод:

public void SaveData()
{
   try
   {
        foreach (var somevar1 in list.SomeType1s)
        {
            CEData.SaveRow(sometype1)
        }    
        foreach (var somevar2 in list.SomeType2s)
        {
            CEData.SaveRow(sometype2)
        }    
        foreach (var somevar3 in list.SomeType3s)
        {
            CEData.SaveRow(sometype3)
        }    
        foreach (var somevar4 in list.SomeType4s)
        {
            CEData.SaveRow(sometype4)
        }    
        foreach (var somevar5 in list.SomeType5s)
        {
            CEData.SaveRow(sometype5)
        }    
   }
   catch (Exception e)
   {
     logger.DebugException("Rollback Occured with the following stack trace: \r\n" 
         + e.StackTrace, e);
     Rollback();
     throw;
   }
}

есть ли способ узнать в части улова, к какой строке я попал? Моя трассировка стека просто скажет, что она была в методе SaveData (), но не в какой строке произошла ошибка.

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

Итак, я подумал, что спросить. Можно ли узнать, какая строка выполнялась при возникновении исключения?


Подробнее:

Похоже, номера строк должны быть стандартными. Единственная причина, по которой я вижу, что я их не получаю, заключается в том, что я занимаюсь разработкой Windows Mobile и Compact Framework. Так может они не входят в компактные рамки? (Мой проект имеет "полный" набор для вывода информации отладки.)

Ответы [ 3 ]

6 голосов
/ 18 августа 2010

Рассмотрим этот фрагмент, используя класс StackFrame в System.Diagnostics:

using System.Diagnostics;
....
catch (Exception ex) {
  StackTrace st = new StackTrace(new StackFrame(true));
  StackFrame sf = st.GetFrame(0);
  Console.WriteLine(" File: {0}", sf.GetFileName());
  Console.WriteLine(" Method: {0}", sf.GetMethod().Name);
  Console.WriteLine(" Line Number: {0}", sf.GetFileLineNumber());
  Console.WriteLine(" Column Number: {0}", sf.GetFileColumnNumber());
}

Для конкретных Compact Framework, содержит ли ошибка .ToString() номер строки? Возможно что-то вроде:

 catch(Exception ex)
 {string errDesc = ex.ToString();}

Раскрывая:

"System.Exception: foo \ r \ n в MyProf.Class.MyMethod (int foo) в D: \ sourcecode \ somefile.cs: строка 1234"

2 голосов
/ 18 августа 2010

Когда вы ловите исключение, используйте метод Exception.ToString (). Если у вас есть совпадающие файлы .pdb в том же каталоге, что и ваш exe / dll (что вы можете сделать, выбрав конфигурацию отладочной сборки), то вывод будет включать номера строк автоматически.

1 голос
/ 18 августа 2010

Нет, Compact Framework не предоставляет эту информацию. Реорганизуйте SaveData в приватные методы для каждого из циклов for, тогда вы хотя бы сузите его (по имени метода или входному параметру).

...