Обычно я сталкиваюсь с ситуациями, когда мне нужно усвоить исключение, созданное очищающим кодом в блоке 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()
, хорошая идея? Если нет, то лучший способ справиться с вышеуказанными ситуациями, чтобы исключения не проглатывались?