А почему не упростить и не убрать кучу ненужных try?
public void doAndForget() {
boolean firstOk = false;
boolean secondOk = false;
try{
firstOk = service.doFirst();
if (firstOk){ //Если есть какая то жесткая зависимость исхода выполнения
secondOk = service.doSecond();
}
} catch(Чего угодно){
Log.warn("Status 1 task: "+ firstOk+"; 2nd task "+secondOk;
} finally {
//Проверить флаги и вызвать откаты в нужной последовательности
}
}
И всё же лучше не пытаться поймать какие то NoClassDefFound или там java.lang.OutOfMemoryError: PermGen space, в последнем случае там уже в памяти может быть всякая срань, не доработавший gc или что то. Данные могут быть уже не валидны или неверны.