C_Sharp-例外処理
例外処理について
例外(exception)と例外処理について
例外とは、プログラムの実行の継続を妨げる異常な事象(エラー)のことです。
例外が発生した場合に、現在の処理を中断して別の処理を行うことを例外処理といいます。
例外の捕捉
C#では、「try-catch-finally」で例外を捕捉します。
class FileData
{
public string[] lines;
// コンストラクタ
public FileData(string filename)
{
// ファイルを読み込み配列に格納する
this.lines = System.IO.File.ReadAllLines(filename);
}
// ファイル内容を出力する
public void show()
{
foreach(string line in lines){
System.Console.WriteLine(line);
}
}
}
class Program
{
static int Main(string[] args)
{
try{
// 例外の発生を監視するブロック
System.Console.WriteLine("[try]");
FileData fd = new FileData(args[0]);
fd.show();
}catch(System.Exception ex){
// 発生した例外に対する処理ブロック
System.Console.WriteLine("[catch]");
System.Console.WriteLine(ex); // エラー内容を出力
}finally{
//例外発生の有無にかかわらず実行したい処理ブロック
System.Console.WriteLine("[finally]");
}
return(0);
}
}
例外の発生
例外を意図的に発生させるには、tryブロック内で「throw」を実行します。
throw 例外クラスのインスタンス
tryブロック内で関数呼び出しがある場合、その内部関数もtryブロック内であると見なされます。
class ErrInfo
{
public void error_occur()
{
System.Console.WriteLine("Let's throw!");
throw new System.Exception("Exception test");
}
}
class Program
{
static int Main(string[] args)
{
try{
// 例外の発生を監視するブロック
ErrInfo err_obj = new ErrInfo();
err_obj.error_occur();
}catch(System.Exception ex){
// 発生した例外に対する処理ブロック
System.Console.WriteLine(ex); // エラー内容を出力
}finally{
//例外発生の有無にかかわらず実行したい処理ブロック
}
return(0);
}
}
標準で用意されている例外クラス
.NET Frameowrk が標準で提供する例外クラスで利用頻度の高いものを記載します。
System名前空間
ArgumentNullException | 引数がnullである。 |
ArgumentException | メソッドの引数が不正である場合。 |
ArrayTypeMismatchException | 不正な型の要素を配列に格納しようとした場合。 |
OverflowException | 算術演算やキャストでオーバーフローが起きた場合。 |
NotImplementedException | メソッドが未実装の場合。 |
NullReferenceException | nullオブジェクト参照を逆参照しようとした場合。ぬるぽ。 |
DivideByZeroException | 0での除算。 |
System.IO名前空間
DirectoryNotFoundException | ディレクトリが存在しない場合。 |
FileNotFoundException | ファイルが存在しない場合。 |
EndOfStreamException | ストリームの末尾を超えて読み込もうとしている場合。 |
System.Collections.Generic名前空間
KeyNotFoundException | コレクションに該当するキーが存在しない場合。 |