На днях придумал задачку и, как это бывает, попробовал решить ее. Есть процедура из двух частей. Если между первой и второй частью будет ошибка — нужно откатить первую во что бы то ни стало. Если ошибка произошла во время второй части, то нужно откатить вторую часть, а потом первую и никак иначе. В итоге родился try/catch монстр.
public void doAndForget() {
try {
service.doFirstPart();
try {
service.doSecondPart();
} catch (Throwable t) {
Log.warn(t);
try {
service.doRollbackSecondPart();
try {
service.doRollbackFirstPart();
} catch(Throwable t1) {
Log.error(t1);
}
} catch (Throwable t1) {
Log.error(t1);
}
}
} catch (Throwable t) {
Log.warn(t);
try {
service.doRollbackFirstPart();
} catch (Throwable t1) {
Log.error(t1);
}
}
}
Почему Throwable, а не Exception? Боюсь. Вдруг какая-нибудь либа внутри кинет NoClassDefFoundError или AssertionError, тогда мы не откатимся. Да, вроде как, Error — это ошибки, которые даже не надо пытаться исправить, но я хочу исправить не ошибку, а то, что сделал мой код до нее. Да, вроде как, если упадет OutOfMemoryError, то текущий Thread должен просто умереть, но я хочу хотя бы попытаться восстановить состояние приложения.
Что скажут противники catchThrowable? Везде расставить catchException?