Вы не должны выбрасывать какие-либо исключения, которые автоматически генерируются CLR из-за ошибок пользователя. Например
- StackOverflowException
- NullReferenceException
- AccessViolationException
- и т.д ...
Причина в том, что это создает путаницу для людей, вызывающих ваш API. Пользователи должны иметь возможность различать активно генерируемые исключения с помощью API и исключения, которые не генерируются активно (генерируемые CLR).
Причина в том, что при активно сгенерированном исключении обычно представляет известное состояние в API. Если я вызываю API, и он выдает ArgumentException, у меня есть разумное ожидание, что данный объект находится в хорошем состоянии. Это признало потенциально плохую ситуацию и активно объяснило это. С другой стороны, если он генерирует исключение NullRefrenceException, это указывает на то, что API обнаружил неизвестную ошибку и теперь находится в ненадежном состоянии.
Другая меньшая причина заключается в том, что эти исключения ведут себя по-разному, когда генерируются пользовательским кодом, в отличие от CLR. Например, можно перехватить исключение StackOverflowException, если оно генерируется кодом пользователя, но не в том случае, если оно генерируется CLR.
РЕДАКТИРОВАТЬ Ответ на комментарий Михаила
Вы также не должны напрямую генерировать Exception, ApplicationException или SystemException. Эти типы исключений слишком общие, чтобы предоставлять значимую информацию к коду, который вызывает ваш API. Правда, вы можете поместить очень описательное сообщение в параметр сообщения. Но поймать исключение, основанное на сообщении, нелегко и просто. Гораздо лучше ловить его по типу.
Правило FxCop на эту тему: http://msdn.microsoft.com/en-us/library/ms182338(VS.80).aspx