Объединение в цепочку метода и исключения в C#

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

        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#?

Спасибо

Править: вот то, что я в настоящее время получаю:

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

6
задан devoured elysium 21 May 2010 в 15:16
поделиться

4 ответа

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

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

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

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

6
ответ дан 10 December 2019 в 02:43
поделиться

Вы можете увидеть точную строку кода, в которой было сгенерировано исключение, но строка кода, которая вызвала метод, вызывающий исключение, будет иметь номер 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 или путем создания объекта StackTrace) будет содержать 2 кадра:

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

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

1
ответ дан 10 December 2019 в 02:43
поделиться

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

Изменить : Вы действительно генерируете исключение? Затем посмотрите на трассировку стека исключений.

1
ответ дан 10 December 2019 в 02:43
поделиться

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

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

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

1
ответ дан 10 December 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: