ここではC#の例外処理について学びます。すでに少しだけ触れてますが、これは実行時エラーへの対策となります。
ただ、例外処理もクラスの知識を必要とします。そのため60%くらいの解説になりますが、今はここまでいいと思ってます。
例外 (Exception)
C#では実行時に発生するエラーを例外と言います。僕が知ってる他の言語も大半が同じだった気がします。
この例外とは、特定の条件において処理を完了できない問題が起きると発生し、その例外を誰もcatch(キャッチ)しないとプログラムが強制終了します。
catchについては後で説明しますが、例外が発生する処理とは何でしょうか。いくつか例を書くので確認してみましょう。
- 変換できない文字列を数値に変換しようとした。
- 配列で存在しないインデックスにアクセスしようとした。
- 値がnullなのに参照アクセスしようとした。
などなど。このようなことをプログラムで実行すると例外が発生します。
これは以前に試した、入力された文字列を数値に変換するサンプルコードです。
この時に数値に変換できない文字列だと例外が起きてましたよね。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
int n = int.Parse(s);
Console.WriteLine(n);
}
}
}
例外が発生する条件って分かるんですか?
分かります。嫌だと思うけど次のリンク先のExceptionsって部分を見ましょう。
https://learn.microsoft.com/en-us/dotnet/api/system.int32.parse
英語だ...
しょうがないな。一部を画像で切り抜いてあげよう。
これが1次ソース、つまり公式ドキュメントのint.Parse()の解説です。
ここでは深くは言いませんが、困ったら公式ドキュメントを見る癖をつけましょう。
という事で、int.Parse()の公式ドキュメントには以下の4つの例外が発生することが書かれてます。
- ArgumentNullException
- ArgumentException
- FormatException
- OverflowException
ここでは内容は触れませんが、例外には種類があって元から想定された例外が発生すると理解してください。
catch
これは発生した例外を捕まえることを言います。
例外とはある場所を起点に発生し、誰もcatchしないと永遠と上位へ渡っていきます。
その結果、上り続けた例外がMain関数すら超えると、プログラムは強制終了で落ちます。
例えば、Main関数からFunction1関数、さらにFunction2関数を呼び出し、そこで例外が発生した場合を考えましょう。
これをcatchするために、それ専用の構文が存在します。それがtry-catch文です。
try-catch
先に構文とサンプルコードを確認しましょう。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
try
{
int n = int.Parse(s); // 例外の可能性がある
Console.WriteLine(n);
}
catch
{
// 例外が発生した場合の処理
Console.WriteLine("例外が発生しました。");
}
}
}
}
このように例外を発生させる可能性がある場所をtryで囲みます。
そして続けてcatchを書くことで、例外発生時の対処を記述することができます。
もしかしてMain関数を全部tryで囲っておけば安全では!
そこに気がつくとは天才。ぶっちゃけ賛否両論なんだけど、何もしないよりはオススメだよ。
もちろん全部を囲むならcatchの中で原因を特定できる記録を残さないと駄目だよ。
try-catch-finally
tryで例外が発生すると無条件でcatchに流れます。この時に終了処理みたいな、絶対に実行したい処理がある場合、どうしたらいいのでしょうか。
安心してください。それ用の構文が用意されてます。それがtry-catch-finallyです。
では、構文とサンプルコードを確認しましょう。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
string s = Console.ReadLine();
try
{
int n = int.Parse(s); // 例外の可能性がある
Console.WriteLine(n);
}
catch
{
// 例外が発生した場合の処理
Console.WriteLine("例外が発生しました。");
}
finally
{
// 必ず実行する処理
Console.WriteLine("終了処理");
}
}
}
}
finallyが追加されてるだけなので問題ないですよね。
このfinallyは例外の発生に関わらず必ず実行されます。
例外とエラー
例外とエラー、似てるとは思いませんか? よくある定義だと、例外は想定していたエラー、エラーは想定してなかったエラーと言われます。
つまり例外は予め発生する要因が分かってるから対策が可能であり、エラーは本当に不明だったから対策できなかった的なやつです。
よく分からないよ。
僕もよく分からないよ。
えぇ...
たぶん宗教問題だよ。
あとがき
今の知識に合わせて一部を省いて説明しました。それでも基本的な使い方は書いたつもりです。
別のタイミングで追加の情報をまとめるので、その時に改めて学習しましょう。
今回はC#の例外処理について知識を深めます。残念ながら前回の内容は実用レベルだと不十分で、本格的なプログラムを作る場合は知識が足りません。例外(Exception)最初におさらいです。C#では実行時に発生するエラーを例外と言います。そして、この例外を誰もcatch(キャッチ)しない場合にプログラムが強制終了します。また、この例外処理ですが、一般的に重い処理(コストが高いと言う)に分類されます。つまりは極論になりますが、例外処理で対策するよりも事前の分岐処理で逃げた...
◆ C#に関する学習コンテンツ
この記事は参考になりましたか?
コメント