Лучшее исключение для недопустимого аргумента универсального типа - PullRequest
97 голосов
/ 11 сентября 2009

В настоящее время я пишу код для UnconstrainedMelody , который имеет универсальные методы для работы с перечислениями.

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

Просто чтобы сделать этот бетон, если у меня есть что-то вроде этого:

// Returns a value with all bits set by any values
public static T GetBitMask<T>() where T : struct, IEnumConstraint
{
    if (!IsFlags<T>()) // This method doesn't throw
    {
        throw new ???
    }
    // Normal work here
}

Какое лучшее исключение бросить? ArgumentException звучит логично, но это аргумент type , а не обычный аргумент, который может легко запутать вещи. Должен ли я представить свой собственный класс TypeArgumentException? Использовать InvalidOperationException? NotSupportedException? Что-нибудь еще?

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

Ответы [ 11 ]

1 голос
/ 11 сентября 2009

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

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

Если пользователь пытается передать что-то, что не является перечислением, я бы выдал исключение InvalidOperationException.

Edit:

Остальные поднимают интересный вопрос, что это не поддерживается. Моя единственная проблема, связанная с NotSupportedException, заключается в том, что, как правило, это исключения, которые генерируются, когда в систему вводится «темная материя», или, другими словами, «этот метод должен войти в систему через этот интерфейс, но мы не включайте до версии 2.4 "

Я также видел исключение NotSupportedExceptions как исключение при лицензировании: «вы используете бесплатную версию этого программного обеспечения, эта функция не поддерживается».

Редактировать 2:

Еще один возможный:

System.ComponentModel.InvalidEnumArgumentException  

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

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