Метод цепочки и исключения в C # - PullRequest
6 голосов
/ 21 мая 2010

Если у меня есть цепочка методов, подобная следующей:

        var abc = new ABC();
        abc.method1()
           .method2()
           .methodThrowsException()
           .method3()
           ;

при условии, что я определил method1(), method2() и method3() как

    public ABC method1() {
        return this;
    }

и methodThrowsException() как

    public ABC method3() {
        throw new ArgumentException();
    }

Можно ли при запуске кода узнать, какая именно строка кода вызвала исключение, или он просто будет рассматривать все цепочки методов как одну строку? Я сделал простой тест, и кажется, что он рассматривает их все как одну строку, но цепочка методов говорит

Размещение методов также в отдельных строках облегчает отладку как ошибку Управление сообщениями и отладчиком обычно построчно.

Я что-то упустил или это просто не относится к C #?

Спасибо

Edit: вот что я сейчас получаю:

альтернативный текст http://img163.imageshack.us/img163/4503/83077881.png

Ответы [ 4 ]

6 голосов
/ 21 мая 2010

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

Полагаю, что форматирование кода по-другому было бы полезно, если бы отладчик позволял вам ставить точку останова на определенной строке, но в C # точки останова помещаются в отдельные выражения, поэтому это не поможет. Вам, вероятно, потребуется переписать код, подобный этому, чтобы разрешить размещение точек останова:

var abc = new ABC(); 
var abc1 = abc.method1();
var abc2 = abc1.method2();
// etc...

То же самое относится к выделению текущего выражения (на вашем скриншоте). Однако точная информация об исключении всегда доступна в трассировке стека.

1 голос
/ 21 мая 2010

Вы можете увидеть точную строку кода, где было сгенерировано исключение, но строка кода, которая вызвала метод, который вызывает исключение, будет 2 (см. Нумерацию ниже)

         try {

Line 1        var abc = new ABC();
Line 2        abc.method1()
Line 3           .method2()
Line 4           .methodThrowsException()
Line 5           .method3();
Line 6  catch(Exception e)
        {
            StackTrace t = new StackTrace(e, true);
        }

Трассировка стека (вы можете увидеть ее либо в трассировке стека исключений, либо создав объект StackTrace) будет содержать 2 кадра:

  • первый будет в строке и файле, где определен метод, который вызывает исключение

  • второй будет в строке 2

1 голос
/ 21 мая 2010

Если вы запустите пример кода, вы увидите, что строка, сообщаемая в трассировке стека, на самом деле является строкой, в которой выдается исключение, а не строкой вызова метода. Отладчик VS также останавливается на этой строке, а не на вызове метода.

Обновление: зеленая ошибка слева от вашего снимка экрана указывает, что вы не на вершине стека вызовов. Откройте окно Call Stack (например, через меню Отладка -> Windows -> CAll Stack ) и дважды щелкните первую строку, чтобы добраться до места, где фактически выдается исключение. Первый метод в стеке вызовов также будет method3().

Обратите внимание, что цитата Мартина Фаулера относится к отладке в целом, поэтому она может быть верной для Java IDE или других интегрированных отладчиков, но не для Visual Studio IDE. Тем не менее, вы сможете легко определить метод, вызвавший проблему, посмотрев трассировку стека исключения.

1 голос
/ 21 мая 2010

Отладчик VisualStudio (я предполагаю, что вы используете VS, а не Mono, поскольку Mono не имеет отладчика) знает фактическую строку, которую выполняет ваш код, и не сворачивает все операторы до ближайшей точки с запятой, как обычно делают большинство отладчиков C / C ++. Таким же образом, даже если вы поместите все операторы в одну и ту же строку , VS сможет показать вам, какой метод выполняется, а какой вызвал исключение.

Редактировать : У вас действительно есть исключение? Затем посмотрите на трассировку стека исключений.

...