То, что действительно необходимо, но иерархия исключений .net не обеспечивает, - это чистый способ различения исключений, которые означают «Запрошенная операция не произошла, но состояние системы в основном хорошее, за исключением той степени, которая подразумевается операция не произошла "из тех, которые означают" процессор горит, и даже попытка сохранить работу текущего пользователя, скорее всего, не усугубит ситуацию ". Есть много контекстов, в которых действительно нужно стремиться отловить все исключения первого типа, в идеале не отлавливая исключения второго. Хотя есть несколько градаций, помимо двух приведенных выше, обычно при отлове исключений на самом деле не волнует различие между InvalidArgumentException или InvalidOperationException; то, что заботится о том, является ли общее состояние системы действительным или поврежденным.
Как есть, если кто-то звонит, например, плагин для импорта файлов, и он выдает исключение, я не совсем уверен, что это можно сделать, кроме как попытаться перехватить и выбросить действительно плохие исключения, в то время как все остальные исключения выдают диалоговое окно «Этот файл не может быть открыт» , Надеюсь, что состояние системы в этот момент, по сути, таково, как если бы пользователь не пытался открыть файл, но без какого-либо стандартизированного способа указания серьезности исключений, я не думаю, что есть какой-либо способ быть уверенным.
Между прочим, если бы у меня были мои барабанщики, был бы класс ExceptionBase, из которого могли бы возникнуть все исключения; большинство исключений будет происходить из Exception (которое, в свою очередь, будет происходить из ExceptionBase), но такие вещи, как ThreadAbortException, StackOverflowException, OutOfMemoryException и т. д. будут производными от CriticalException. Таким образом, вы можете поймать большинство «неожиданных» исключений, случайно не подавив действительно плохие.