Если вам необходимо обработать SubclassOfException
определенным образом, используйте catch SubclassOfException
.
Нет смысла использовать цепочку из instanceof
, если это в основном то, что уже делает обработка исключений.
try {
} catch (SubclassOfException e) {
// Do something specific to SubclassOfException
} catch (Exception e) {
// Do something for other types.
}
в основном так же, как:
try {
} catch (Exception e) {
if (e instanceof SubclassOfException) {
// Do something specific to SubclassOfException.
// Note that you have to cast explicitly if you want to use
// subclass-specific properties of SubclassOfException.
} else {
// Do something for other types.
}
}
Я думаю, ясно, что первое является более удобным для чтения, и это будет более эффективно выполняться, так это то, как JVM ожидает код обработки исключений для написания.
Еще одно преимущество написания в первом способе является то, что вы не можете написать:
try {
// ...
} catch (SubclassOfException e) {
} catch (SubclassOfSubclassOfException e) {
}
, потому что первый улов будет перехватывать все исключения, которые будут подбираются второй улов, делая второй улов избыточными. Таким образом, это ошибка во время компиляции, описанная в JLS Sec 11.2.3:
Это ошибка времени компиляции, если условие задвижки может поймать класс исключения E1 и предшествующее положение на вылов непосредственно вмещающий оператор Ьги может catch E1 или суперкласс E1.
Прежде всего, вам нужно поймать наиболее специфичные типы и наименее специфичные типы после.
С другой стороны,
if (e instanceof SubclassOfException) {
} else if (e instanceof SubclassOfSubclassOfException) {
}
не ошибка во время компиляции, даже если вторая ветвь не может быть выполнена либо; вы просто увидите, что все SubclassOfSubclassOfException
s обрабатываются так, как если бы они были просто SubclassOfException
s.
«не имея длинного списка« если есть », чтобы проверить, какой подкласс« вы могли бы использовать посетителя (возможно) –