ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

例外について(3/3)

f:id:covory10101101276:20171220221939p:plain

みなさんこんにちは🌚

最近プログラミング勉強したい欲が高まっているのに学校が忙しくてできないブルーノです😹冬休みに向けて頑張ってスキマ時間を見つけてやっていきます!!というわけで前回の例外処理の様々な他の例をまとめていきます。

 

throw文

 あるtry-catchブロックが含まれているメソッドの中で別のtry-catchブロックが含まれているメソッドを呼び出したい時、内側の例外を外側に投げることができます。これを文字のままスロー(throw)と言います。投げるにはオブジェクト化しなければなりません。ちょっと実感が湧きづらいので例のスクショをあげます

f:id:covory10101101276:20171222112644p:imagef:id:covory10101101276:20171222112644p:image

まず3~19行目の行では配列の境界を越えたり0で割ろうとしたりわざと例外を発生させるように作られたCalcメソッドを設けています。まずここで配列を超えると12行目のIndexOutOfRangeException例外を捕まえるキャッチブロックに捕まります。するとそのメッセージを表示した後にDivideByZeroException例外をオブジェクト化し(14行目)、外側にスローするようになっています(16行目)。そしてこの3~19行目のメソッドを呼び出すのが次の21~34行目のBruno087クラスです。このメソッドは先ほどの一連を呼び出すだけのtryブロックで、キャッチブロックにはDivideByZeroExceptionをキャッチするようになっています。そう、先ほどスローするよう組まれたDivideByZeroExceptionはここでキャッチされ、またその旨のメッセージを表示します。そして最後にこのクラスをメインメソッドから実行しています。つまり、自分で例外を作成し、外側に投げているわけですね。ということはこのプログラムの3~19行目の中で0の除算を行わなくても

f:id:covory10101101276:20171222114216p:imagef:id:covory10101101276:20171222114218p:imagef:id:covory10101101276:20171222114222p:image

このようにDivideByZeroExceptionは投げられ、キャッチされるのです。ちょっとメソッドを別々に組んでいてわかりにくいですね。なので今度はこれをforループの時のようにネストしていまいましょう。

 

try-catch節のネスト

f:id:covory10101101276:20171222133053p:imagef:id:covory10101101276:20171222133056p:image

今度は発生させる例外をOutOfRangeExceptionのみにし、DivideByZeroExceptionとOutOfRangeExceptionの両方のキャッチブロックを張りました。最初のDivideByZeroExceptionのキャッチブロックには当然ですが引っかからず、するとそれが外側にあるOutOfRangeExceptionのキャッチブロックにキャッチされます。このようにtry-catch節をネストさせることもできます。

ただし、同時に例外が複数起こるようCalcメソッド内に設けても最初の例外でキャッチ節に移動してしまうのでそれ以降は実行されないようです。

今回はここまでにします。

 

全3回にして分けるつもりが今回ちょっと長くなってしまいました。あと少しだけまとめることが残っているのでちょっと次回も例外についてまとめます。3回で終わらなかったけどゴメンネ!