Я ищу шаблон общего кода для правильной обработки транзакции в отношении возможного исключения. Я предполагаю, что для этого существует общий шаблон кода, независимо от того, с каким конкретным типом транзакции мы имеем дело.
У меня есть метод, который выполняет что-то в транзакции и хочет перебросить исключение, которое может возникнуть, когда внутри блока кода транзакции. Вот пример такого метода:
protected void doIt() {
// for JDBC connection transaction may be started automatically
// but assume we start it here
Tran tran = session.beginTran();
try {
// here comes code that does some processing
// modifies some data in transaction
// etc.
// success - so commit
tran.commit();
} catch (Exception ex) { // many different exceptions may be thrown
// subclass of RuntimeException, SQLException etc.
// error - so rollback
tran.rollback();
// now rethrow ex
throw ex; // this line causes trouble, see description below
}
}
Теперь - ошибка метода компиляции doIt
. Он должен объявлять throws Exception
, но это неприемлемо, поскольку метод doIt
используется во многих местах, а добавление throws Exception
приводит к последующим модификациям в местах прямого и косвенного использования doIt
. Это связано с известной проблемой проектирования языка Java с объявленными исключениями.
Теперь вопрос : как изменить исключение в сравнении с кодом обработки транзакции для достижения моей цели - правильно обработать завершение транзакции (выполнить фиксацию или откат в зависимости от условия успеха) и повторно выдать точно такое же исключение, которое может быть перехвачено в блоке транзакционного кода.
Я знаю, что мог бы сделать что-то вроде throw new RuntimeException(ex)
, но это исключение другого класса, и я хочу избежать такого решения.