Я не уверен, насколько реален ваш пример, но нет необходимости а) отлавливать каждое исключение отдельно, если вы не обрабатываете их по-разному, или б) отлавливать их вообще, во многих случаях.
То, что вы делаете в своем примере, просто печатаете трассировку стека, является плохой идеей почти во всех случаях.Вы печатаете грязную информацию в место, где никто, вероятно, не обращает внимания.
Я следую двум общим принципам:
- Обрабатывайте исключение в том месте, в котором оно было сгенерировано, если выможет (например, закрыть открытый файл на исключение доступа к файлу или повторить проблемный интерфейс ( глупые ненадежные устройства USB на заказ ... )).
- Разрешить исключению пузыриться до уровня выше в вашем стеке, где вы можете перехватывать все исключения, которые иначе не сможете обработать.Регистрируйте их, отображайте или убивайте свое приложение, что бы ни имело смысла.
Я проиллюстрирую вторую точку с помощью некоторого кода, украденного из , вдохновленного уроками Java .
private String readFirstLineFromFile(String path) throws IOException
{
try (BufferedReader br = new BufferedReader(new FileReader(path)))
{
return br.readLine();
}
}
Здесь, мы определили метод, который пытается читать из файла.Здесь многое может пойти не так, но код этого уровня ничего не сделает с этим.Вместо этого он перейдет к методу, который его вызвал, с предложением throws
.Этот вызывающий метод может обработать само исключение или передать блага его вызывающей стороне, с тем же условием:
private String readAllTheFiles() throws IOException
{
for (...)
{
readFirstLineFromFile(...);
}
}
Теперь есть много споров вокругпочему Java требует throws
в этом случае.Многие другие языки не используют их, к лучшему или худшему.Вы часто будете видеть RuntimeExceptions
- исключения, которые не требуют предложения throws
.Если ваш метод может выдать исключение, которое простирается от RuntimeException
, вам не нужно объявлять этот факт в throws
.