例外処理の基本

2018年12月27日

例外処理とは

例外処理とは、例外が発生した場合の対処をするための処理のことを言います。

例外の種類

  • 3/0のような、演算不可能な処理
  • ファイルがないのに読み込もうとした
  • クラス型変数宣言のみをした変数(new でインスタンスを作っていない)
  • 配列の範囲外にアクセスした。(a[3]のところ、a[5]にアクセスした。など)

例えば、次のようなコードがあった場合、

int a = 0;
int b = 3 / a;

結果

Attempted to divide by zero.

と表示され、ビルドできません。なので実行前に気づけます。

例外が発生するサンプル

int a = int.Parse(Console.ReadLine());
int b = 3 / a;

だったらどうでしょう。

aは入力されるまでわからない(何を入力されるか)ので、ビルドでエラーなりません。

プログラムを実行して、0が入力されて初めてエラーになるのです。
さらに、そのエラーは処理ができないので、プログラムが強制的にストップしてしまいます。

例外処理のサンプル

そこで、次のコードのようにエラーが発生する可能性があるコードをtryブロック内に記述し、例外エラーが発生した場合は、catchブロックで処理するようにします。

try
{
    int a = int.Parse(Console.ReadLine());
    int b = 3 / a;
}
catch
{
    Console.WriteLine("0では割れません");
}

結果

0では割れません

と表示されるようになり、プログラムは実行を継続できます。

例外情報の取得

次のようなコードで、エラー内容を表示することもできます。

try
{
    int a = int.Parse(Console.ReadLine());
    int b = 3 / a;
}
catch (Exception ex)
{
    Console.WriteLine("0では割れません");
    Console.WriteLine($"エラーは、{ex.Message}です");
}

結果

0では割れません
エラーは、Attempted to divide by zero.です

例外処理導入について

例外処理は、他の処理に比べて低速のため、なんでもかんでも追加しないようにします。正常系の処理には使いません。

❌使ってはいけない例

int[] array = { 1, 2, 3 };
try
{
    int i = 1;
    while (true)
    {
        Console.WriteLine(array[i]);
        i++;
    }
}

結果

2
3
範囲外のエラーです
エラーは、Index was outside the bounds of the array.です

例外処理を使わずに対応したコード

この場合は、次のコードで十分です。
foreachで配列要素数分だけ処理を実施しています。

int[] array = { 1, 2, 3 };
foreach (var item in array)
{
    Console.WriteLine(item);
}
int[] array = { 1, 2, 3 };
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine(array[i]);
}

2018年12月27日C#,入門

Posted by hidepon