Да, это означает, что они могут быть явно перехвачены кодом, который знает, как их обрабатывать.
например, представьте, что у вас было:
class MyRecoverableException extends Exception {
...
}
После этого вы можете получить код, который может автоматически различать их и реагировать соответствующим образом, например:
try{
// ... do something ...
}catch(MyRecoverableException e) {
// Recover
}catch(Throwable t) {
// Log fatal reason, and exit gracefully.
}
Очевидно, что сколько вам нужно, это проблема, которую вы должны решить, разработчик приложения, но четкое разделение может иметь все значение при определении того, что пошло не так, а исключения с подклассами могут содержать дополнительные свойства, используемые для передачи соответствующей информации. хендлерам об исключительных обстоятельствах, которые их вызвали.
Наличие базового типа для расширения для вашего приложения / библиотеки также никогда не повредит - если только по какой-либо другой причине, кроме разрешения разделения источника при ведении журнала, - но точная иерархия и сложность, требуемая помимо этого, полностью зависят от проекта. У некоторых проектов есть естественный и очевидный выбор, для некоторых требуется немного больше обдумывания (а иногда и немного обдумывания и рефакторинга).