Обычно я сталкиваюсь с ситуациями, когда мне нужно усвоить исключение, созданное очищающим кодом в блоке catch/finally, чтобы предотвратить проглатывание оригинального исключения.
Например:
// Closing a file in Java
public void example1() throws IOException {
boolean exceptionThrown = false;
FileWriter out = new FileWriter("test.txt");
try {
out.write("example");
} catch (IOException ex) {
exceptionThrown = true;
throw ex;
} finally {
try {
out.close();
} catch (IOException ex) {
if (!exceptionThrown) throw ex;
// Else, swallow the exception thrown by the close() method
// to prevent the original being swallowed.
}
}
}
// Rolling back a transaction in .Net
public void example2() {
using (SqlConnection connection = new SqlConnection(this.connectionString)) {
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction = command.BeginTransaction();
try {
// Execute some database statements.
transaction.Commit();
} catch {
try {
transaction.Rollback();
} catch {
// Swallow the exception thrown by the Rollback() method
// to prevent the original being swallowed.
}
throw;
}
}
}
Предположим, что регистрация любого из исключений не является опцией в объеме блока метода, но будет выполняться кодом, вызывающим методы example1() и example2().
Проглатывает исключения, создаваемые методами close() и Rollback(), хорошая идея? Если нет, то лучший способ справиться с вышеуказанными ситуациями, чтобы исключения не проглатывались?