例外処理の怪

構造化された例外処理を持つ言語ならば、次のような構文は必ずあるはず。

try {
    ... 何らかの処理 ...
} catch(...) {
    ... 例外処理 ...
} finally {
    ... 後片付け ...
}

で、私は常々疑問に思う。私は例外処理はだ〜い嫌いだから(ソースが醜くなるし、意味的に意味のないインデントが入る)、なるたけなら使いたくないんだけど、Javaとかだといつかは使わないといけない。
よくJava系の例外処理のサンプルについてくるのが、入出力の例だ。こんなの↓。

try {
    FileReader reader = new FileReader( ... );
    .....
} catch( IOException e ){
    e.printStackTrace();
} finally {
    try {
        reader.close();
    } catch( IOException e ){}
}

よく、finally節でポートのcloseをかけると素晴らしいみたいな記述を見かける。でもさあ、ポートをcloseするとき、例外が発生するかもしれないわけよ。それで、finally節でさらに例外処理を行わなければならない。それで、closeのときに例外が発生したら、どうするのかと。ポートは閉じられないのかと。
ようするに、結局のところ、誰がcloseしたことを保障してくれるのかと。
ちと愚痴っぽくなったが、例外処理が例外処理を呼ぶと言う微妙な構造を何とかして欲しいと思ったわけさね。それとも、もっとうまいやり方があるのかなあ。