Как обрабатывать исключения броска внутри блока 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();
        }
    }
}
Другие вопросы по тегам