Как правильно обрабатывать RuntimeException?

145
22 марта 2019, 21:30

Как правильно обрабатывать RuntimeException? Например, у меня есть следующий код:

if (file.exists() || file.mkdirs()) {
    // далее идёт запись в файл
}    

Оба метода, File.exists() и File.mkdirs(), могут выбрасывать SecurityException, которая является подклассом RuntimeException. И насколько я знаю, RuntimeException нужно обрабатывать особым образом. Но всё-таки я не до конца понимаю, как именно их правильнее обрабатывать... Или правильнее их вообще не обрабатывать? Т.е., в этом конкретном случае, какой вариант будет правильнее?

1) проверять только результат выполнения методов, без try-catch:

if (file.exists() || file.mkdirs()) {
   // запись в файл
} 

2) проверять в try-catch:

try {
     if (file.exists() || file.mkdirs()) {
          // запись в файл
     }
          //...
} catch (e: SecurityException) {
          // обработка ошибки
}
Answer 1

Написание того или иного кода зависит от того, какой уровень обработки ошибок вы хотите для своего приложения.

Если вы выберите первый способ, то приложение при исполнении просто выведет ошибку в лог или консоль. При этом человек разбирающийся в Java возможно и сможет определить суть проблемы и найти способ, как этой ошибки избежать. Однако это далеко не лучший способ, так как пользователь просто увидит FileNotFoundException или что-то вроде того.

Второй способ позволяет несколько доработать программу таким образом, чтобы она сама предпринимала действия в случае возникновения данной ошибки:

  • Самый простой способ, это залогировать в данном блоке суть возникновения ошибки, например добавить код, который проверяет существует ли папка или файл, и затем выдать человеко-читаемый ответ, например, что файл по пути ./... не найден.
  • Другой вариант, позволить программе поискать данный файл в похожих или стандартных папках.

В общем случае, try-catch позволяет что-то сделать с тем, что в ходе исполнения программы возникла ошибка.

Конкретно в вашем случае, надо посмотреть на класс SecurityException и например дать совет пользователям, что они должны дать привелегии для чтения или записи по данному пути.

Answer 2

Отлавливать RuntimeException, которое кидается не в вашем коде не имеет смысла. В приведенном описании по ссылке сказано, что такие исключения кидаются в случае если программа дальше не может работать.

Поэтому первый вариант вам больше подходит, но вы можете все-таки отлавливать такие исключения если у вас есть обработчик исключений.

Другое дело, если RuntimeException кидается в вашем коде, и вы делаете это намеренно, по причине того, скажем, если нельзя использовать Exception. Тогда, такие исключения следует отлавливать на более высоком уровне, и кидать Exception.

READ ALSO
зависимости тестов в TestNG

зависимости тестов в TestNG

Помогите пожалуйста установить зависимостиУ меня есть тесты:

178
EmptyStackException из ничего в Java

EmptyStackException из ничего в Java

появилась такая проблема в Java, есть метод FunctionCall:

131
как в процесcе создания нового пользователя извлечь сгенерированный id

как в процесcе создания нового пользователя извлечь сгенерированный id

Регистрирую в приложении нового пользователяЕму присваивается id

156
SybSQLException: Syntax error during explicit conversion

SybSQLException: Syntax error during explicit conversion

Всем приветСтолкнулся с ошибкой

164