Обработка исключений при назначении переменной C # - PullRequest
3 голосов
/ 27 января 2011

Работая над проектом, я понял, что есть кое-что, чего я действительно не знаю о C # (и я тоже не могу найти ничего об этом в Google). Если вы присваиваете значение переменной (которая уже была инициализирована значением по умолчанию), и это значение создается другим методом, что произойдет, если вы получите исключение в другом методе. Для пояснения вот пример:

eType = defaultvalue;
...
eType = (EReaderType)Enum.Parse(typeof(EReaderType), tXmlNode.InnerText, true);

Что произойдет, если Enum.Parse не сможет проанализировать значение (строка в XML, здесь неважно ...) и выдает исключение? Будет ли eType сохранять значение по умолчанию или будет переназначен чем-то другим (null или неопределенная блабла)? Пока что мои тесты показывают, что он сохранит прежнее значение. Однако я не уверен, будет ли это работать постоянно или случайно. Проще говоря, я не знаю, как C # справляется с этим.

Редактировать: Хорошо, большое спасибо за все ответы:)

Ответы [ 5 ]

17 голосов
/ 27 января 2011

Если вы не уверены, что разбор будет успешным, рассмотрите возможность использования Enum.TryParse.

Но в вашем примере правая часть должна быть полностью оценена перед назначениемимеет место, поэтому исключение при обработке правой стороны предотвратит назначение.

8 голосов
/ 27 января 2011

Правильный способ рассуждать об этом:

  • побочные эффекты подвыражений выполняются от слева направо .
  • побочные эффекты операторов выполняются в порядке приоритета .

Предположим, у вас есть:

M().x = N(P()).Q(); // x is a variable

Порядок, в котором происходят вещиis:

  • M () выполняется
  • определяется местоположение x
  • P () выполняется
  • N () выполняется
  • Q () выполняется
  • происходит присвоение x

Если одна из этих вещей выдает исключение, то все, что происходит после исключения, никогда не выполняется.

2 голосов
/ 27 января 2011

Думайте об этом с точки зрения шагов .

Если у вас есть:

var x = SomeOperation();

Вот что происходит:

  1. SomeOperation выполняет.
  2. Возвращаемое значение присваивается x.

Если исключение выдается в SomeOperation, то указанный выше шаг 1 не завершается. Это означает, что шаг 2 никогда не достигается.

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

2 голосов
/ 27 января 2011

Переменная будет сохранять свое старое значение, потому что фактическая операция eType = (вычисленное значение) не будет выполнена, потому что она вызовет исключение во время процесса вычисления этого значения (в данном случае парсинга строки)

1 голос
/ 27 января 2011

Насколько я знаю, это вызовет исключение во время второго выделения, которое в конечном итоге не сохранит новое значение, сохранив старое

...