Консультируйтесь со своей командой об их изменениях, или по крайней мере посмотрите на разность очень тщательно, прежде, чем зафиксировать любые конфликты слияния. Попросите, чтобы они рассмотрели объединенный, кодируют себя, чтобы удостовериться, что их дополнения не были потеряны в слиянии.
NotSupportedException
звучит , как будто он явно подходит, но в документации четко указано, что его следует использовать для различное назначение. Из примечаний к классу MSDN:
Есть методы, которые не поддерживается в базовом классе, с ожидание, что эти методы будут реализовано в производных классах вместо. Производный класс может реализовать только подмножество методов из базового класса и бросить NotSupportedException для неподдерживаемые методы.
Конечно, есть способ, которым NotSupportedException
явно достаточно хорош, особенно с учетом его здравого смысла. Сказав это, я не уверен, что это правильно.
Учитывая цель Unconstrained Melody ...
Есть различные полезные вещи, которые можно сделать с помощью универсального методы / классы, для которых существует ограничение типа «T: enum» или «T:
Потребуется ли у клиентов возможность отличать это от исключений BCL? Когда клиент может случайно вызвать это, используя ванильное
перечисление
? Как бы вы ответили на вопросы, поставленные принятым ответом на Какие факторы следует учитывать при написании настраиваемого класса исключений?
Я бы избегал NotSupportedException. Это исключение используется в среде, где метод не реализован и есть свойство, указывающее, что этот тип операции не поддерживается. Здесь это не подходит
Я думаю, что InvalidOperationException - это наиболее подходящее исключение, которое вы могли бы здесь создать.
Generic programming should not throw at runtime for invalid type parameters. It should not compile, you should have a compile time enforcement. I don't know what IsFlag
contains, but perhaps you can turn this into a compile time enforcement, like trying to create a type that is only possible to create with 'flags'. Perhaps a traits
class can help.
Update
If you must throw, I'd vote for InvalidOperationException. The reasoning is that generic types have parameters and errors related to (method) parameters are centered around the ArgumentException hierarchy. However, the recommendation on ArgumentException states that
if the failure does not involve the arguments themselves, then InvalidOperationException should be used.
There is at least one leap of faith in there, that method parameters recommendations are also to be applied to generic parameters, but there isn't anything better in the SystemException hierachy imho.
Я бы использовал NotSupportedException, поскольку это то, что вы говорите. Другие перечисления, кроме конкретных, не поддерживаются . Это, конечно, будет более четко указано в сообщении об исключении.
Я бы выбрал NotSupportedException
. Хотя ArgumentException
выглядит нормально, это действительно ожидаемо, когда аргумент, переданный методу, неприемлем. Аргумент типа - это определяющая характеристика фактического метода, который вы хотите вызвать, а не реальный «аргумент». InvalidOperationException
следует генерировать, если выполняемая вами операция может быть допустимой в некоторых случаях, но для конкретной ситуации это неприемлемо.
NotSupportedException
генерируется, когда операция изначально не поддерживается. Например, при реализации интерфейса, в котором конкретный член не имеет смысла для класса. Это похоже на аналогичную ситуацию.
Выбрасывание настраиваемого исключения всегда должно выполняться в любом случае, когда это вызывает сомнения. Пользовательское исключение будет работать всегда, независимо от потребностей пользователей API. Разработчик может поймать любой тип исключения, если ему все равно, но если разработчику требуется особая обработка, он будет SOL.
Как насчет наследования от NotSupportedException. Хотя я согласен с @Mehrdad в том, что это имеет наибольший смысл, я слышал вашу точку зрения, что это, похоже, не идеально подходит. Поэтому наследуйте от NotSupportedException, и таким образом люди, кодирующие ваш API, все равно могут перехватить NotSupportedException.
Я бы тоже проголосовал для InvalidOperationException. Я сделал (неполную) блок-схему рекомендаций по выбрасыванию исключений .NET на основе рекомендаций по проектированию фреймворка, 2-е изд. некоторое время назад, если кому-то интересно.
Я всегда осторожен написания пользовательских исключений исключительно на том основании, что они не всегда четко документируются и вызывают путаницу, если не названы правильно.
В этом случае я бы выбросил ArgumentException при неудачной проверке флагов. На самом деле все зависит от предпочтений. Некоторые стандарты кодирования I ' Мы видели, что дошли до определения того, какие типы исключений должны генерироваться в подобных сценариях.
Если пользователь пытался передать что-то, что не было перечислением, я бы выбрасывал InvalidOperationException.
Изменить:
Остальные поднимают интересный вопрос, что это не поддерживается. Меня беспокоит только NotSupportedException, что обычно это исключения, которые возникают, когда в систему вводится «темная материя», или, другими словами, «Этот метод должен войти в систему через этот интерфейс, но мы выиграли не включайте его до версии 2.4 »
Я также видел, как NotSupportedExceptions генерировался как исключение лицензирования« вы используете бесплатную версию этого программного обеспечения, эта функция не поддерживается ».
Редактировать 2:
Другой возможный: