スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
実行時エラーの一例
まずは、以下のようなコードを考えてみましょう。
ソースコード(言語はC#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Try02 { class Program { static void Main(string[] args) { Console.WriteLine("処理前"); int[] arr = new int[5]; arr[5] = 5; Console.WriteLine("処理後"); } } } |
実行結果
処理前
ハンドルされていない例外: System.IndexOutOfRangeException: インデックスが配列の境界外です。
この文はエラーになります。
int[] arr = new int[5];
上の文で、配列はarr[0]~arr[4]まで用意されます。
しかし、6番目に相当するarr[5]は存在しません。
そのため、IndexOutOfRangeExceptionが生じます。
この段階でプログラムの処理が中断します。
その結果、以下の文は処理されません。
Console.WriteLine(“処理後”);
try~catch文
try~catch文は以下のように使います
try
{
例外が起こりそうな処理;
}
catch
{
例外が起きた場合の処理;
}
まず、例外が起こりそうなコードをtry{}の中に入れておきます。
もしも、エラーがあった場合は、その時点で、tryブロックの処理は中断します。そして、catchブロックの処理が行われます。
もしもエラーが生じなかった場合は、catchブロックの処理は実行されません。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Try01 { class Program { static void Main(string[] args) { try { Console.WriteLine("処理前"); int[] arr = new int[5]; arr[5] = 5; Console.WriteLine("処理後"); } catch { Console.WriteLine("エラーが生じました"); } Console.WriteLine("操作が完了しました"); } } } |
実行結果
処理前
エラーが生じました
操作が完了しました
エラーが生じた時にcatchブロックに制御が移るので、以下の文は処理されません。
Console.WriteLine(“処理後”);
それ以外の文は、処理されます。
例外の握り潰し
ここで、catchブロックで何も処理を記述しなかったとします。
この場合、tryブロックで例外が発生したとしても、プログラムを実行した人は、あたかも問題なく処理が終わったかのように見えてしまいます。
つまり、例外が起きたか起きていないか、判断できなくなります。
このように、例外があたかもなかったかのように見せかけることを「例外を握り潰す」と言ったりします。
このような例外の握り潰しは、エラーの見落としにつながるので、非推奨な行為です。
ソースコード(例外の握り潰し)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Try03 { class Program { static void Main(string[] args) { try { Console.WriteLine("処理前"); int[] arr = new int[5]; arr[5] = 5; Console.WriteLine("処理後"); } catch { } Console.WriteLine("操作が完了しました"); } } } |
実行結果
処理前
操作が完了しました
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。