It's something that has long frustrated me.
I normally declare a variable exceptionThrown=true at the top and set it to false just before returning. Then you can test that in the finally handler. I think that's better than catching and re-throwing because the latter approach will mess up the stack trace.
I'm surprised neither Java nor C# has a better way of handling this