It would be a little more cumbersome to write, but the same effect can be achieved easily:
A a = new A();
try {
B(a);
return C(a);
} finally {
a.cleanup();
}
Transforms into: Either<Exception, Result> ret;
A a = new A();
ret = B(a);
if (ret.isRight()) ret = C(a);
a.cleanup();
return ret;
Maybe someone can rewrite this even more cleanly. I can think of an easy-to-generate improvement containing a GOTO.