В идеале исключения должны быть сгруппированы в иерархию таким образом, чтобы, если код захочет обрабатывать несколько исключений одинаково, все они будут получены из общего базового класса. Если бы базовый тип типа throwable был интерфейсом, а не классом, такой идеал мог бы быть несколько достижимым. Тем не менее, ограничение единственного наследования для классов серьезно ограничивает полезность иерархии.
Единственный случай, когда иерархия исключений может быть полезной концепцией, - это когда реализация интерфейса или новая версия класса, которая задокументирована как выбрасывание определенных исключений, хочет позволить коду различать более различные условия, чем сообщаются с этими исключениями. В таком сценарии наличие метода, генерирующего исключения, которые не являются производными от документированных, будет критическим изменением, поэтому необходимо генерировать исключение, которое наследуется от документированного, которое лучше всего описывает ранее непредвиденное условие. Это довольно некрасиво, но механизм обработки исключений на самом деле не предоставляет лучшей альтернативы. Весьма прискорбно, что такие вещи, как IEnumerator<T>.MoveNext()
, не задокументированы как выдающие какие-либо исключения, которые просто означали бы: «Извините - система не горит или что-то в этом роде, и я не знаю, что кто-то изменил коллекцию, но я могу не переходите к следующему пункту и не говорите правдиво, что перечисление завершено ", но они этого не делают.
За исключением случая, когда нужно генерировать исключение, совместимое с существующим кодом, может быть полезно, чтобы исключения, используемые приложением или библиотекой, происходили из общей базы. Вместо использования ApplicationException
это должно быть что-то вроде YourApplicationNameException
или YourLibraryNameException
- что-то, из чего больше ничего не получится. Что-то вроде ApplicationException
плохо, потому что код, который выполняет catch ApplicationException
, получит не только исключения, которые он извлекает из этого типа, но также и любые исключения, которые получены из других библиотек.