2015/02/06

[C#]try-catch-finallyの通る順番

このエントリーをはてなブックマークに追加

try-catch-finallyの通る順番

古典的ですが、try-catchの通る順番について検証をしてみました。
catch内でthrowしてもfinallyにいくのか?とか。知ってるけど、言われるとちょっと不安になってしまった。やってみりゃいいじゃん、ということで、やってみた。
もちろん結果は、想定どおり。不信がる必要はありませんでした。
try中にExceptionが発生すると、catch行って、finally実装されてたらそこにいくわけです。そりゃそれ以外の結果だと、納得いかないでしょうよ。
ソースコード
// 二重のtry-catchにて、奥のcatch内にてthrowしてもfinallyを通る順番に変化はないのかの検証
Console.WriteLine("0");
try {
    Console.WriteLine("1");

    try {
        Console.WriteLine("2");
        throw new Exception(""); // ここでthrow入ります
    } catch (Exception ex) {
        Console.WriteLine("3");
    throw ex;
    } finally {
        Console.WriteLine("4");
    }

} catch (Exception ex) {
    Console.WriteLine("5");
} finally {
    Console.WriteLine("6");
}
Console.WriteLine("7");
出力結果









はい、安心です。
出力結果は、予想通り。ちゃんと動いてくれてます。

yield returnと組み合わせたときのfinallyの呼び出し

おまけにyield returnと組み合わせたときのfinallyの呼び出しってどうなんだろうと。yield returnは呼び出し時に実行される遅延実行なので、打ち切られたときとかもちゃんと呼ばれるのかと。
これもめんどくさそうですが気にしたほうがよさそうです。

ソースコード
private void button1_Click(object sender, EventArgs e) {
    Console.WriteLine("0");

    IEnumerable<int> en = this.Hoge();
    Console.WriteLine("1");

    foreach (int i in en) {
        if (i == 0) {
            Console.WriteLine("3");
        } else if (i == 1) {
            Console.WriteLine("5");
        }
    }
    Console.WriteLine("7");
}

private IEnumerable<int> Hoge() {
    try {
        Console.WriteLine("2");
        yield return 0;

        Console.WriteLine("4");
        yield return 1;

    }finally{
        Console.WriteLine("6 呼ばれた!"); // これがいつ呼ばれるのか?
    }
}

実行結果






6 呼ばれた!


はい、こんな感じですね。3のところでreturnしちゃっても、そのあとちゃんと6が呼ばれます。

0 件のコメント :

コメントを投稿