Получение исключения из Enum - PullRequest
2 голосов
/ 31 августа 2011

Я получил журнал ошибок, в котором показан следующий код, выдавший исключение в наборе

  public double Value {
        get {
            switch (DefinedUnits.Distance) {
                case DistanceUnits.Feet: { return Feet; }
                case DistanceUnits.Meters: { return Meters; }
                case DistanceUnits.NM: { return NauticalMiles; }
                default: { throw new Exception("Invalid Distance Unit Specified"); }
            }
        }
        set {
            switch (DefinedUnits.Distance) {
                case DistanceUnits.Feet: { Feet = value; break; }
                case DistanceUnits.Meters: { Meters = value; break; }
                case DistanceUnits.NM: { NauticalMiles = value; break; }
                default: { throw new Exception("Invalid Distance Unit Specified"); }
            }
        }
    }

DefinedUnits.Distance - это перечисление:

public enum DistanceUnits {
        Meters,
        Feet,
        NM
    }

Я не вижу в своем коде, что можно отправить что-то еще. У меня нет места, где это перечисление рассматривается как целое число, так что неверное значение может быть передано. Пользователь не может сказать мне, что он делал. Или, скорее, он говорит мне, что делал что-то, что не могло бы назвать это.

Есть ли логическое объяснение, почему это произошло и как я могу это остановить?

Спасибо

Ответы [ 4 ]

3 голосов
/ 31 августа 2011

Возможно, значение было выбрано до того, как оно было установлено, оставив значение по умолчанию, которое было недействительным? (Предположительно, если вы не установили никаких соответствующих целых чисел, Meters должно соответствовать 0 ...) Вы должны настроить свой код на:

  • Создайте более конкретное исключение (например, InvalidOperationException)
  • Включить значение в сообщение об исключении

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

1 голос
/ 31 августа 2011

DefinedUnits.Distance имеет значение null или инициализируется чем-то вне диапазона.

Изменение обработчика по умолчанию должно дать вам подсказку:

default: { throw new Exception("Invalid Distance Unit Specified: " + DefinedUnits.Distance != null ? DefinedUnits.Distance.ToString() : '**null**' ); }

0 голосов
/ 31 августа 2011

Если вы используете Dotfuscator (или какое-либо другое запутывающее программное обеспечение) и преобразуете строковое значение (например, «Ноги») в enum, то возможно, что имена перечислений были запутаны, и преобразование строк в перечисления не удалось.

0 голосов
/ 31 августа 2011

Вывести в журнал значение Exception.StackTrace и (int) DefinedUnits.Distance для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...