Если мне нужно выбросить исключение из моего приложения, какие из встроенных классов исключений .NET я могу использовать? Они все честные игры? Когда я должен получить свой собственный?
Какие встроенные исключения .NET можно выбросить из приложения?
Ответ 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
. Для чего стоит, всегда старайтесь использовать наиболее конкретное исключение. Если у вас нет ни одного, отвечающего вашим требованиям, не стесняйтесь создавать свои собственные. В этом случае, однако, убедитесь, что ваше исключение имеет преимущество над существующими исключениями. В частности, он должен прекрасно передать свое значение и предоставить всю информацию, необходимую для эффективного урегулирования ситуации.
Избегайте создания исключений-заглушек, которые не делают ничего значимого. В том же духе, избегайте создания огромных иерархий классов исключений, они редко бывают полезны (хотя я могу представить ситуацию или две, где я буду использовать их... один из них - парсер).
Ответ 3
Я регулярно использую ArgumentException
(и его "друзей" ).
NotSupportedException
и NotImplementedException
также являются общими.
Ответ 4
Моим советом было бы сосредоточиться на двух вещах:
- Сценарии
- Ожидания пользователей
В других словах я сидел и идентифицировал:
- В каких сценариях вы хотите делать исключения.
- В этих сценариях, что ожидали бы пользователи вашего API
Ответ на # 1, конечно, относится к конкретным приложениям. Ответ на # 2 - "то, что когда-либо похожий код, с которым они уже знакомы".
Поведение, которое выходит из этого:
-
В сценариях, которые возникают в ваших программах, которые также поступают в framework, например, аргументы, являющиеся нулевыми, вне диапазона, являются недействительными, а методы не или просто не поддерживается, тогда вы должны использовать те же исключения, что и использует каркас. Люди, использующие ваши API, будут ожидать, что они будут вести себя так, (потому что, как все ведет себя), и поэтому будет лучше использовать ваш api из "get go".
- Для новых сценариев, которые не существуют в рамках, вы должны идти вперед и изобретать ваши собственные классы исключений. Я бы сказал, что вы предпочтете исключение в качестве базы класс, если они не являются каким-либо другим базовым исключением, предоставляющим вам необходимые службы. Вообще-то я не думаю, что что-то вроде "ApplicationException" поможет вам много. Когда вы начинаете определять свои собственные исключения, есть несколько вещей, которые вы должны имейте в виду:
а. Основная цель исключения - для общения людей. Они передают информацию о том, что произошло, чего не должно было быть. Они должны обеспечить достаточно информации, чтобы определить причину проблемы и выяснить, как разрешите его.
б. Внутренняя согласованность чрезвычайно важна. Создание приложения как универсальное насколько это возможно при аналогичных обстоятельствах, вы сделаете пользователей API более продуктивными.
Поскольку существуют жесткие и быстрые правила о том, что вы должны и не должны делать... Я бы не стал беспокоиться об этом. Вместо этого я бы просто сосредоточился на определении сценариев, нахождении существующего исключения, которое соответствует этим сценариям, а затем тщательно вычеркивает свое, если существующего не существует.
Ответ 5
Вы можете создавать и бросать почти любой из них, но вы, как правило, не должны. Например, различные исключения проверки аргументов (ArgumentException, ArgumentNullException, ArgumentOutOfRangeException и т.д.) Подходят для использования в коде приложения, но AccessViolationException - нет. ApplicationException предоставляется в качестве подходящего базового класса для любых настраиваемых классов исключений, которые могут потребоваться.
См. эту статью статью MSDN для получения списка лучших практик - это относится к обработке исключений, но также содержит полезные советы по их созданию..