例外への対応
例外とはプログラムの実行中に発生する、処理を継続することができないエラーのこと。
このような例外が発生した場合の対応方法をあらかじめ記述する必要がある。
この対応を例外処理という。
tryキーワード、catchキーワード
C#にはtryキーワードとcatchキーワードを使い、例外処理を記述します。
public static void Practice_Q15_2_2()
{
try
{
var total = 1000;
var line = Console.ReadLine();
var count = int.Parse(line);
var ans = total / count;
Console.WriteLine(ans);
Console.WriteLine("正常終了");
}
catch (System.DivideByZeroException) //DivideByZeroException例外をキャッチする
{
Console.WriteLine("ゼロは入力できません");
}
catch (System.FormatException) //FormatException例外をキャッチする
{
Console.WriteLine("数値を入力してください");
}
catch (System.Exception)
{
Console.WriteLine("予期しないエラーが発生しました");
}
}
このように例外によって種類を分けられる
ただし下記のコードはコンパイルエラーになる
try
{
:
}
catch (System.Exception)
{
Console.WriteLine("予期しないエラーが発生しました");
}
catch (System.FormatException)
{
Console.WriteLine("ゼロは入力できません");
}
catch (System.Exception)
{
Console.WriteLine("数値を入力してください");
}
コンパイルエラーになる理由は二つあります
- System.Exception例外は全ての例外の継承元のクラスである
- try-catch構文では、コードに書かれた順番に例外の種類をチェックしていく
全ての例外はSystem.Exceptionクラスの派生クラスなので、System.ExcepExceptionクラスとは必ずis aの関係になります。
そのため、**catch(System.Exception)**ブロックが先頭にあると、全ての例外がここキャッチされてしまうのです。
つまり、
Console.WriteLine("ゼロは入力できません");
Console.WriteLine("数値を入力してください");
は絶対に実行されることはありません。
例外オブジェクトにアクセスする##
例外のさらに詳しい情報を取得したいとき、例外オブジェクトにアクセスすることで、些細なエラー情報を取得できます。
try
{
Book book = null;
var title = book.Title; //bookはnullなので、Titleを参照できず例外が発生
Console.WriteLine(title);
}
catch (Exception ex)
{
Console.WriteLine($"Type: {ex.GetType().Name}");
Console.WriteLine($"Message: {ex.Message}");
Console.WriteLine($"TargetSite: {ex.TargetSite}");
Console.WriteLine($"StackTrace: {ex.StackTrace}");
}
実行結果######
Type: NullReferenceException
Message: Object reference not set to an instance of an object.
TargetSite: Void Practice_Q15_2_3()
StackTrace: at practice.Program.Practice_Q15_2_3() in /Users/tamuratoorunin/Projects/practice/practice/Program.cs:line 44
exは、catchブロックで利用できる変数で、Exception例外オブジェクトを表しています。
今日の記事は以上です。ありがとうございました。
何か指摘、ご意見あればご連絡ください。