スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
実行時エラーの一例
まずは、以下のようなコードを考えてみましょう。
ソースコード(言語は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("操作が完了しました"); } } } |
実行結果
処理前
操作が完了しました
~プログラミングを勉強してみませんか?~
TechAcademy [テックアカデミー] は無料の体験講座が用意されているので、気軽に体験できます。
※私(サイト主)も無料体験講座を実際に受けてみました(→感想)