Подтвердить что ты не робот

Какие встроенные исключения .NET можно выбросить из приложения?

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

4b9b3361

Ответ 1

См. Создание и удаление исключений.

При бросании встроенных исключений он говорит:

Не бросайте System.Exception, System.SystemException, System.NullReferenceException или System.IndexOutOfRangeException умышленно из вашего собственного исходного кода.

и

Не выбрасывать общие исключения

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

Вместо этого либо введите более производный тип, который уже существует в фреймворке, либо создайте свой собственный тип, который происходит из Exception. "

В этой записи также есть несколько полезных рекомендаций.

Кроме того, анализ кода FxCop определяет список "не поднимать исключения" как описанный здесь. Он рекомендует:

Следующие типы исключений являются слишком общими для предоставления пользователю достаточной информации:

  • System.Exception
  • System.ApplicationException
  • System.SystemException

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

  • System.ExecutionEngineException
  • System.IndexOutOfRangeException
  • System.NullReferenceException
  • System.OutOfMemoryException

Таким образом, в теории вы можете поднять любой другой тип исключения фреймворка, предоставляя вам четкое представление о намерении исключения, описанном Microsoft (см. документацию MSDN).

Обратите внимание, что это "рекомендации", и, как говорили некоторые другие, в System.IndexOutOfRangeException есть дебаты (т.е. многие разработчики бросают это исключение).

Ответ 2

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

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

Избегайте создания исключений-заглушек, которые не делают ничего значимого. В том же духе, избегайте создания огромных иерархий классов исключений, они редко бывают полезны (хотя я могу представить ситуацию или две, где я буду использовать их... один из них - парсер).

Ответ 4

Моим советом было бы сосредоточиться на двух вещах:

  • Сценарии
  • Ожидания пользователей

В других словах я сидел и идентифицировал:

  • В каких сценариях вы хотите делать исключения.
  • В этих сценариях, что ожидали бы пользователи вашего API

Ответ на # 1, конечно, относится к конкретным приложениям. Ответ на # 2 - "то, что когда-либо похожий код, с которым они уже знакомы".

Поведение, которое выходит из этого:

  • В сценариях, которые возникают в ваших программах, которые также поступают в framework, например, аргументы, являющиеся нулевыми, вне диапазона, являются недействительными, а методы не или просто не поддерживается, тогда вы должны использовать те же исключения, что и использует каркас. Люди, использующие ваши API, будут ожидать, что они будут вести себя так, (потому что, как все ведет себя), и поэтому будет лучше использовать ваш api из "get go".

    1. Для новых сценариев, которые не существуют в рамках, вы должны идти вперед и изобретать ваши собственные классы исключений. Я бы сказал, что вы предпочтете исключение в качестве базы класс, если они не являются каким-либо другим базовым исключением, предоставляющим вам необходимые службы. Вообще-то я не думаю, что что-то вроде "ApplicationException" поможет вам много. Когда вы начинаете определять свои собственные исключения, есть несколько вещей, которые вы должны имейте в виду:

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

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

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

Ответ 5

Вы можете создавать и бросать почти любой из них, но вы, как правило, не должны. Например, различные исключения проверки аргументов (ArgumentException, ArgumentNullException, ArgumentOutOfRangeException и т.д.) Подходят для использования в коде приложения, но AccessViolationException - нет. ApplicationException предоставляется в качестве подходящего базового класса для любых настраиваемых классов исключений, которые могут потребоваться.

См. эту статью статью MSDN для получения списка лучших практик - это относится к обработке исключений, но также содержит полезные советы по их созданию..