@ Решение Джона Скита - самое чистое. Еще одно решение, которое может вас заинтересовать.
try {
// Stuff here
} catch(Throwable t) {
clean(t);
// bypasses the compiler check
Thread.currentThread().stop(t);
}
Я бы предложил использовать этот подход только в том случае, если вам нужно знать, какое исключение выдается. например Для ресурсов, которые у меня закрыты, я записываю исключение, которое вызвало их закрытие. Таким образом, если я пытаюсь использовать ресурс, и он закрыт, я могу понять, почему он закрыт.
private void checkClosed() {
if (closed)
throw new IllegalStateException("Closed", reasonClosed);
}