Как обрабатывать исключения броска внутри блока finally в Java
В Java, не рекомендуется бросать исключения внутри finally
раздел в try-chatch
блокировать из-за скрытия распространения любого необработанного throwable
который был брошен в try
или же catch
блок. Эта практика blocker
нарушение уровня в соответствии с профилем сонара по умолчанию.
Ошибка сонара: удалите этот оператор throw из этого блока finally.
Пожалуйста, рассмотрите следующий фрагмент кода.
Например: закрыть входной поток внутри блока finally и обработать возможные исключения могут возникнуть при закрытии потока.
public void upload(File file) {
ChannelSftp c = (ChannelSftp) channel;
BufferedInputStream bis = new BufferedInputStream(file.toInputStream());
try {
String uploadLocation = Files.simplifyPath(this.fileLocation + "/" + file.getName());
c.put(bis, uploadLocation);
} catch (SftpException e) {
throw new IllegalTargetException("Error occurred while uploading " + e.getMessage());
} finally {
try {
bis.close();
} catch (IOException e) {
throw new UnsupportedOperationException("Exception occurred while closing Input stream " + e.getMessage());
}
}
}
Был бы признателен, если бы вы могли показать традиционный способ решения этих ситуаций.
1 ответ
Лучший способ справиться с этой проблемой - использовать try-with-resource
, Но если кто-то хочет закрыть соединение вручную и показать исключение try
или же catch
блок без скрытия, следующий фрагмент кода является решением.
public void upload(File file) throws IOException {
ChannelSftp c = (ChannelSftp) channel;
BufferedInputStream bis = new BufferedInputStream(file.toInputStream());
SftpException sftpException = null;
try {
String uploadLocation = Files.simplifyPath(this.fileLocation + "/" + file.getName());
c.put(bis, uploadLocation);
} catch (SftpException e) {
sftpException = e;
throw new IllegalTargetException("Error occurred while uploading " + e.getMessage());
} finally {
if (sftpException != null) {
try {
bis.close();
} catch (Throwable t) {
sftpException.addSuppressed(t);
}
} else {
bis.close();
}
}
}