Да, MadMurf указывает на самое важное отличие: проверка достижимости во время компиляции.Стандартная идиома поймает что-то вроде этого и по праву предотвратит компиляцию:
try {
} catch (IndexOutOfBoundsException iooe) {
} catch (ArrayIndexOutOfBoundsException aiooe) {
}
Компилируется аналог if / instanceof, предложенный в исходном вопросе (это НЕ то, что вы хотели бы, потому что он ошибочен).
Причина, по которой стандартная идиома отлавливает ошибку во время компиляции, приведена в JLS 14.21 Недоступные заявления .
- Достигнут блок перехвата Cесли оба следующих условия верны:
- [...]
- Нет более раннего блока catch A в операторе try, так что тип параметра C такой же, как у подкласса илитипа параметра А.
Чтобы дополнительно проиллюстрировать эту точку, следующие компиляции:
try {
} catch (Exception e) {
if (e instanceof Exception) {
} else if (e instanceof Exception) {
}
}
Как вы можете видеть, этоИдиому «ловить покемонов» гораздо сложнее поддерживать, поскольку он обходит некоторые из проверок достижимости во время компиляции, применяемые в стандартной идиоме.
Чтобы еще яснее понять, сделали ли вынамеренно или нет, вы фактически изменили порядок, в котором вы проверяли исключения в исходном вопросе, и этот факт мог быть легко пропущен другими.Если SubSubException является подклассом SubException, второе условие if НИКОГДА не будет оцениваться, а его тело является фактически недоступным кодом.
Подход if / instanceof ОЧЕНЬ подвержен ошибкам.