例外処理って?
例外(本来はプログラム中で起こってはいけないことが起こってしまうこと)起こったときでもプログラムが異常な動作をしないようすること。
例外の例)
- ユーザーが想定外の文字列を入力
- プログラムに必要なファイルが開けない etc.
例外処理の方法1throw文
static int CharToInt(char c)
{
if(c < '0' || '9' < c)
throw new FormatException(); // 不正な文字が入力された場合、例外を投げる
return c - '0';
}
throw 文によって投げられる例外は、 System.Exception クラスの派生クラスのインスタンスなので、それ以外のクラスのインスタンスを throw することは出来ません。
例外処理の方法2 try-catch-finally 文
使い方
try
{
例外が投げられる可能性のあるコード
}
catch(例外の種類)
{
例外処理コード
}
finally
{
例外発生の有無にかかわらず実行したいコード
リソースの破棄などが一般的か
}
複数の例外処理をしたい
ぱっと思いつくのはExceptionをキャッチすることかなと思います。
これなら例外を取りこぼすこともないはずです。
しかし、無駄な例外処理まで行ってしまうのであまりよくないと思います。
他のやり方
catch (Exception exception)
{
if (exception is ArgumentNullException ||
exception is InvalidOperationException ||
exception is ArgumentOutOfRangeException)
{
DoErrorHandling();
return;
}
こんな感じで例外オブジェクトの型を、より詳細に見ることで解決できたと思います。
コメントより種類ごとにcatchしたほうが良いという指摘を受けたので、その方法も載せておきます。
catch (ArgumentNullException)
{
DoErrorHandling();
}
catch (ArgumentOutOfRangeException)
{
DoErrorHandling();
}
catch (InvalidOperationException)
{
DoErrorHandling();
}
例外フィルター whenについて
C# 6で、例外のcatch句に続けてwhenと書くことで、catchしたい例外の条件が追加できるようになりました。
つまり、先ほど書いた
catch (ArgumentNullException)
{
DoErrorHandling();
}
catch (ArgumentOutOfRangeException)
{
DoErrorHandling();
}
catch (InvalidOperationException)
{
DoErrorHandling();
}
これの例外処理が同じだった場合まとめて書くことができます。
try
{
F();
}
catch (Exception e) when (e is ArgumentNullException || e is ArgumentOutOfRangeException)
{