Всем привет!
Подскажите, пожалуйста, почему мы можем обернуть любое исключение в RuntimeException, если этот класс унаследован от Exception и не факт, что мы обернем unchecked exception. Нам может попасться FileNotFoundException, который является checked.
![]()
kr0kant
19 уровень
Обертывание Exceptions
Обсуждается
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #3303140
11 января 2024, 12:44
Тебя интересует "почему" или "зачем"?
Если "почему" - то просто потому что можем, потому что класс RuntimeException с конструктором (Exception) это позволяет. Более того, я бы сказал, что он для того и нужен, чтобы оборачивать checked и делать их unchecked. Что тебя конкретно в этом смущает? От того, что ты поймал FileNotFound, файл у тебя от этого не появится, и ошибка в дальнейшем алгоритме никуда не исчезнет.
Разница в том, что с этими исключениями происходит дальше. Если ты работаешь с проверяемыми исключениями, то у тебя по сути два варианта - либо обработать его на месте в том же методе и предусмотреть, что делать при возникновении того или иного типа исключений, либо пробрасывать его выше и выше до тех пор, пока не пробросишь до того места, в котором ты хотел бы это исключение обрабатывать.
Если же его обернуть в непроверяемое исключение, то ты можешь его просто выбросить в этом месте, и на другом уровне приложения предусмотреть какой-то общий ExceptionHandler, какое-то общее место для обработки всех исключений твоего приложения.
То есть проблема с FileNotFound exception состоит не в том, что указанный файл просто был не найден, а в том, что у тебя от этого файла зависела какая-то часть логики приложения, и она не смогла быть выполнена. И тебе в связи с этим нужно что-то сделать, например вывести сообщение пользователю и начать какой-то алгоритм заново. Представь, что у тебя таких мест в программе много, и тебе тогда нужно в каждом месте делать обработку этих исключений.
Вместо этого ты можешь написать класс SomeLogicFailedException extends RuntimeException и в нужных тебе местах расставить throw SomeLogicFailedException(caughtException) и написать один хэндлер, который уже будет ловить конкретно этот тип исключений и выполнять соответствующие этому действия.
+1
Денис Enterprise Java Developer
11 января 2024, 12:28
Что именно ты понимаешь под "обернуть"? если throw new так ты просто бросаешь новое исключение, не более того.
Учитывая наличие общего родителя Throwable проблемы такое оборачивание не вызовет.
Ну или уточни вопрос.
0
kr0kant
18 января 2024, 14:45
В данном случае переменная e - это исключение или причина(cause)? Если причина, то конструктор RuntimeException нормально к этому отнесется. Но если это исключение?
![]()
0
Денис Enterprise Java Developer
18 января 2024, 15:23
Там в catch блоке написано что такое переменная е.
Ты к своему вопросу прикрепил диаграмму, подумай почему Exception принимается там где ожидается Throwable
0
hidden #3303140
18 января 2024, 15:34
Продолжаем заниматься сортировкой каши в голове 😄
cause - это просто название переменной, а тип у неё Throwable. Исключение, которое ты передаёшь аргументом в конструктор - это и есть причина, по которой ты вызываешь этот конструктор и вообще изначально решил создать RuntimeException.
То есть где-то выше произошла какая-то хрень, было выброшено исключение, и ты решил пробросить это исключение дальше по рантайму до ближайшего обработчика. То есть это случившееся исключение и побудило тебя это сделать, оно и стало причиной вызова этого конструктора. И именно это исключение ты и передаёшь аргументом в параметр Throwable cause.
Если ты откроешь класс Exception, который есть родитель для всех видов исключений, то ты увидишь там следующее
То есть здесь именно что написано, что во-первых любое исключение наследуется от Throwable, а во-вторых что unchecked (Runtime) исключения нужны ровно для того, чтобы не декларировать о них в сигнатуре метода.
0
hidden #3303140
18 января 2024, 15:38
Ну а если открыть класс Throwable, то он начинается с длиннющего джавадока о том, для чего вообще использовать Throwable
Ну и дальше по тексту. Рекомендую тебе его прочитать, чтобы либо разобраться, либо было о чём спросить. Кстати, там есть абзац, отвечающий тебе на вопрос "зачем оборачивать исключения в рантайм" уже не моими несвязными фразами, а за авторством самого Джошуа Блоха:
0