В Java я хочу сделать что-то вроде этого:
try {
...
} catch (/* code to catch IllegalArgumentException, SecurityException,
IllegalAccessException, and NoSuchFieldException at the same time */) {
someCode();
}
...вместо:
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
}
Есть какой-либо способ сделать это?
java
exception
try-catch
multi-catch
froadie
источник
источник
bitwise or
(|
)? Почему бы не использовать запятую или оператор, имеющий более похожее значение,logical or
(||
)?Не совсем до Java 7, но я бы сделал что-то вроде этого:
Java 6 и раньше
Java 7
источник
exc.getCause()
. В качестве примечания, Роберт К. Мартин (среди прочих) рекомендует использовать непроверенные исключения (компилятор не имеет представления о том, какие исключения будут выбрасываться оттуда); обратитесь к главе 7: Обработка ошибок в его книге « Чистый код» .throw exc
вместоthrow new RuntimeException(exc)
?В Java 7 вы можете определить несколько предложений catch, таких как:
источник
Если существует иерархия исключений, вы можете использовать базовый класс для перехвата всех подклассов исключений. В вырожденном случае вы можете перехватить все исключения Java с помощью:
В более распространенном случае, если RepositoryException является базовым классом, а PathNotFoundException является производным классом, тогда:
Приведенный выше код будет перехватывать RepositoryException и PathNotFoundException для одного вида обработки исключений, а все остальные исключения объединяются. Начиная с Java 7, согласно ответу @ OscarRyz выше:
источник
Нет, по одному на каждого клиента.
Вы можете поймать суперкласс, такой как java.lang.Exception, если вы выполняете одно и то же действие во всех случаях.
Но это не может быть лучшей практикой. Вы должны ловить исключение только тогда, когда у вас есть стратегия для его фактической обработки - а регистрация и повторная обработка не являются «обработкой». Если у вас нет корректирующего действия, лучше добавьте его в сигнатуру метода и дайте всплыть кому-то, кто может справиться с ситуацией.
источник
Более чистая (но менее многословная и, возможно, не столь предпочтительная) альтернатива ответу пользователя user454322 на Java 6 (т. Е. На Android) будет заключаться в том, чтобы перехватывать все
Exception
s и перебрасыватьRuntimeException
s. Это не сработает, если вы планируете перехватывать другие типы исключений дальше по стеку (если только вы не перебрасываете их), но будет эффективно перехватывать все проверенные исключения.Например:
Это, как говорится, для многословия, возможно, было бы лучше установить логическую или некоторую другую переменную и на основе этого выполнить некоторый код после блока try-catch.
источник
В до 7 как насчет:
источник
caught
вfinally
блоке?Да. Вот способ с использованием разделителя трубы (|),
источник
Для kotlin это пока невозможно, но они решили добавить его: Source
Но пока, просто небольшая хитрость:
источник
Поймать исключение, которое оказывается родительским классом в иерархии исключений. Это, конечно, плохая практика . В вашем случае общим родительским исключением является класс Exception, и перехват любого исключения, которое является экземпляром Exception, действительно является плохой практикой - исключения, такие как NullPointerException, обычно являются ошибками программирования и обычно должны решаться путем проверки нулевых значений.
источник