Лучшее исключение для недопустимого общего аргумента типа

Консультируйтесь со своей командой об их изменениях, или по крайней мере посмотрите на разность очень тщательно, прежде, чем зафиксировать любые конфликты слияния. Попросите, чтобы они рассмотрели объединенный, кодируют себя, чтобы удостовериться, что их дополнения не были потеряны в слиянии.

99
задан Jon Skeet 11 September 2009 в 18:35
поделиться

10 ответов

NotSupportedException звучит , как будто он явно подходит, но в документации четко указано, что его следует использовать для различное назначение. Из примечаний к классу MSDN:

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

Конечно, есть способ, которым NotSupportedException явно достаточно хорош, особенно с учетом его здравого смысла. Сказав это, я не уверен, что это правильно.

Учитывая цель Unconstrained Melody ...

Есть различные полезные вещи, которые можно сделать с помощью универсального методы / классы, для которых существует ограничение типа «T: enum» или «T:

Потребуется ли у клиентов возможность отличать это от исключений BCL? Когда клиент может случайно вызвать это, используя ванильное перечисление ? Как бы вы ответили на вопросы, поставленные принятым ответом на Какие факторы следует учитывать при написании настраиваемого класса исключений?

42
ответ дан 24 November 2019 в 05:06
поделиться

Я бы избегал NotSupportedException. Это исключение используется в среде, где метод не реализован и есть свойство, указывающее, что этот тип операции не поддерживается. Здесь это не подходит

Я думаю, что InvalidOperationException - это наиболее подходящее исключение, которое вы могли бы здесь создать.

23
ответ дан 24 November 2019 в 05:06
поделиться

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.

13
ответ дан 24 November 2019 в 05:06
поделиться

Я бы использовал NotSupportedException, поскольку это то, что вы говорите. Другие перечисления, кроме конкретных, не поддерживаются . Это, конечно, будет более четко указано в сообщении об исключении.

9
ответ дан 24 November 2019 в 05:06
поделиться

Я бы выбрал NotSupportedException . Хотя ArgumentException выглядит нормально, это действительно ожидаемо, когда аргумент, переданный методу, неприемлем. Аргумент типа - это определяющая характеристика фактического метода, который вы хотите вызвать, а не реальный «аргумент». InvalidOperationException следует генерировать, если выполняемая вами операция может быть допустимой в некоторых случаях, но для конкретной ситуации это неприемлемо.

NotSupportedException генерируется, когда операция изначально не поддерживается. Например, при реализации интерфейса, в котором конкретный член не имеет смысла для класса. Это похоже на аналогичную ситуацию.

8
ответ дан 24 November 2019 в 05:06
поделиться

Выбрасывание настраиваемого исключения всегда должно выполняться в любом случае, когда это вызывает сомнения. Пользовательское исключение будет работать всегда, независимо от потребностей пользователей API. Разработчик может поймать любой тип исключения, если ему все равно, но если разработчику требуется особая обработка, он будет SOL.

2
ответ дан 24 November 2019 в 05:06
поделиться

Идентификатор NotSupportedExpcetion.

3
ответ дан 24 November 2019 в 05:06
поделиться

Как насчет наследования от NotSupportedException. Хотя я согласен с @Mehrdad в том, что это имеет наибольший смысл, я слышал вашу точку зрения, что это, похоже, не идеально подходит. Поэтому наследуйте от NotSupportedException, и таким образом люди, кодирующие ваш API, все равно могут перехватить NotSupportedException.

1
ответ дан 24 November 2019 в 05:06
поделиться

Я бы тоже проголосовал для InvalidOperationException. Я сделал (неполную) блок-схему рекомендаций по выбрасыванию исключений .NET на основе рекомендаций по проектированию фреймворка, 2-е изд. некоторое время назад, если кому-то интересно.

1
ответ дан 24 November 2019 в 05:06
поделиться

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

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

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

Изменить:

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

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

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

Другой возможный:

1
ответ дан 24 November 2019 в 05:06
поделиться
Другие вопросы по тегам:

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