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");
出力結果
01
2
3
4
5
6
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 呼ばれた!"); // これがいつ呼ばれるのか?
}
}
実行結果
01
2
3
4
5
6 呼ばれた!
7
はい、こんな感じですね。3のところでreturnしちゃっても、そのあとちゃんと6が呼ばれます。
0 件のコメント :
コメントを投稿