См. Создание и создание исключений .
При выдаче встроенных исключений написано:
Не создавайте намеренно исключение 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 (т.е. многие разработчики выдают это исключение).