Мне известно, что оператор try-with-resources был введен для лечения (или) предотвращения маскирования исключений.
Рассмотрим следующий код:
class TestExceptionSuppressing {
public static void main(String[] args) {
try {
testMethod();
} catch (Exception e) {
System.out.println(e.getMessage());
for (Throwable t : e.getSuppressed()) {
System.err.println("Suppressed Exceptions List: " + t);
}
}
}
static void testMethod() {
try (InnerClass inner = new InnerClass()) {
throw new IOException("Exception thrown within try block");
} catch (Exception e) {
throw new RuntimeException(
"Exception thrown within catch block.Hence exception thrown within try block will be lost (or) masked");
}
}
static class InnerClass implements AutoCloseable {
@Override
public void close() throws Exception {
throw new Exception("Exception thrown in close method will be tacked on to existing exceptions");
}
}
}
Вывод: Исключение, выброшенное в блоке catch. Исключение, выброшенное в блоке try, будет потеряно (или) замаскировано
По-видимому, исключение, выданное в блоке catch метода testMethod (), замаскировало как исключение io, выданное в блоке try, так и исключение, подавленное и добавленное к этому исключению io (выданное в методе close)
Этот пример кода может доказать, что try-with-resources не может полностью предотвратить маскирование исключений.
Я знаю, что здесь все перемешано и может быть запутано, но возможен случай. У меня вопрос, есть ли способ предотвратить этот сценарий, то есть маскирование исключений по-прежнему происходит даже при использовании оператора try-with-resources?