Класс исключения: когда извлечь из него, в C # (.Net)? - PullRequest
4 голосов
/ 05 апреля 2010

Я продолжаю пересмотр экзамена.

Я сталкивался с использованием класса Base Exception и видел его также на экзаменационных работах.

Мой вопрос: когда вы учились в классе Base Exception?

У меня сложилось впечатление, что если вы хотите, чтобы пользовательский класс генерировал исключение с более значимой информацией, то вы можете создать пользовательский класс исключений, который содержит точные данные, представляющие способ использования вашего пользовательского класса, и для какого сценария он предназначен?

Почему мой класс исключений не может быть производным от ApplicationException, SecurityException или базового класса Exception?

У меня сложилось впечатление, что я должен быть производным от базового класса Exception, а не от двух предыдущих.

Мой второй вопрос: когда вы выведете из двух других ??? Есть ли четкие Различия относительно того, когда вы будете получать один из этих трех? Предполагая, что я не пропустил других, которых я пропустил?

НЕБОЛЬШОЕ ОБНОВЛЕНИЕ:

Этот вопрос от Transcender в значительной степени ударяет по гвоздю на голове.


* Какой класс следует использовать для создания исключения для конкретного приложения?

Ответ: Класс ApplicationException *

Ответы [ 4 ]

4 голосов
/ 05 апреля 2010

Все это обсуждается в документе Руководство по проектированию .

3 голосов
/ 05 апреля 2010

В нашем последнем проекте мы использовали базовый класс исключений.Мы использовали его, чтобы получить следующие функциональные возможности:

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

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

Один совет к экзамену: очень внимательно прочитайте вопрос.Удачи.

2 голосов
/ 05 апреля 2010

Как правило, вы хотите наследовать от класса Exception, который больше всего напоминает тип исключения, которое вы хотите создать. Если проблема в том, что был передан какой-либо аргумент или параметр, который вызывает проблему, используйте ArgumentException. Если вам нужно что-то настроить, наследуйте от ArgumentException.

По моему опыту, единственными двумя причинами использования базового исключения являются: 1) когда вам нужно какое-то настраиваемое исключение, которое полностью не соответствует ни одной из текущих моделей исключений, или 2) когда метод теоретически может вызвать несколько исключений , но вы уже поймали те, которые, по вашему мнению, будут брошены.

Как правило, я вообще не наследую от исключений. Обычно достаточно просто установить свойство Message.

0 голосов
/ 13 сентября 2013

В идеале исключения должны быть сгруппированы в иерархию таким образом, чтобы, если код захочет обрабатывать несколько исключений одинаково, все они будут получены из общего базового класса. Если бы базовый тип типа throwable был интерфейсом, а не классом, такой идеал мог бы быть несколько достижимым. Тем не менее, ограничение единственного наследования для классов серьезно ограничивает полезность иерархии.

Единственный случай, когда иерархия исключений может быть полезной концепцией, - это когда реализация интерфейса или новая версия класса, которая задокументирована как выбрасывание определенных исключений, хочет позволить коду различать более различные условия, чем сообщаются с этими исключениями. В таком сценарии наличие метода, генерирующего исключения, которые не являются производными от документированных, будет критическим изменением, поэтому необходимо генерировать исключение, которое наследуется от документированного, которое лучше всего описывает ранее непредвиденное условие. Это довольно некрасиво, но механизм обработки исключений на самом деле не предоставляет лучшей альтернативы. Весьма прискорбно, что такие вещи, как IEnumerator<T>.MoveNext(), не задокументированы как выдающие какие-либо исключения, которые просто означали бы: «Извините - система не горит или что-то в этом роде, и я не знаю, что кто-то изменил коллекцию, но я могу не переходите к следующему пункту и не говорите правдиво, что перечисление завершено ", но они этого не делают.

За исключением случая, когда нужно генерировать исключение, совместимое с существующим кодом, может быть полезно, чтобы исключения, используемые приложением или библиотекой, происходили из общей базы. Вместо использования ApplicationException это должно быть что-то вроде YourApplicationNameException или YourLibraryNameException - что-то, из чего больше ничего не получится. Что-то вроде ApplicationException плохо, потому что код, который выполняет catch ApplicationException, получит не только исключения, которые он извлекает из этого типа, но также и любые исключения, которые получены из других библиотек.

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