C# では、数値をゼロで除算するなど、プログラムが正しく実行されない場合に例外が発生します。すべての例外は System.Exception クラスから派生します。例外処理は実行時エラーに対処するプロセスであり、例外処理を使用すると、エラーが発生した場合でもプログラムを正常に実行し続けることができます。

 

C# の例外処理は、try、catch、finally、throw という 4 つのキーワードに基づいて構築されています。

  • try: try ステートメント ブロックは通常、例外が発生しやすいコードを格納するために使用され、その後に 1 つ以上の catch ステートメント ブロックが続きます。
  • catch: catch ステートメント ブロックは、try ステートメント ブロックで発生した例外をキャッチするために使用されます。
  • finally:finally ステートメント ブロックは、例外がスローされるかどうかに関係なく、特定のステートメントを実行するために使用されます。
  • throw: throw は例外をスローするために使用されます。

try/catch ステートメント

コードの一部が例外をスローすると仮定すると、try と catch の組み合わせを使用して例外をキャッチできます。その構文は次のとおりです。

try{
}catch( ExceptionName e1 ){
}catch( ExceptionName e2 ){
}

catch( ExceptionName eN ){
}finally{
   // 
}

上に示したように、複数の catch ステートメント ブロックをリストしてさまざまな種類の例外をキャッチし、異なる状況で try ステートメント ブロックが複数の例外を生成するのを防ぐことができます。

[例] try/catch ステートメントを使用してプログラム内の例外をキャッチします。

 using System;

namespace it-kiso.com
{
    class Demo
    {
        static void Main(string[] args) 
        {
            try{ 
                int a = 123; 
                int b = 0; 
                int x = a / b; 
            }catch (Exception e) {
                Console.WriteLine("捕捉到的例外:{0}", e);
            }finally{
                Console.WriteLine("finally语句块中的代码"); 
            }
            Console.WriteLine("程序中的其它代码"); 
        }
    }
} 

C# の例外クラス

C# の例外クラスは主に System.Exception クラスから派生しています。たとえば、2 つの例外クラス System.ApplicationException と System.SystemException は System.Exception クラスから派生しています。

  • System.ApplicationException クラスはプログラムによって生成された例外をサポートするため、カスタム例外はこのクラスを継承する必要があります。
  • System.SystemException クラスは、すべてのシステム事前定義例外の基本クラスです。

Sytem.SystemException クラスから派生したいくつかの事前定義例外クラスを次の表に示します。

例外クラス 説明
System.IO.IOException I/Oエラーの処理
System.IndexOutOfRangeException メソッドが範囲外の配列インデックスを参照したときに生成されるエラーを処理します。
System.ArrayTypeMismatchException 配列の型が一致しない場合のエラーを処理します
System.NullReferenceException null オブジェクトを参照する際のエラーを処理します。
System.DivideByZeroException ゼロ除算時のエラーを処理する
System.InvalidCastException 型変換中に生成されたエラーを処理する
System.OutOfMemoryException 空きメモリ不足によるエラーの処理
System.StackOverflowException スタック オーバーフローによるエラーを処理する

カスタム例外クラス

システムによって事前定義された例外クラスを使用することに加えて、独自に例外クラスを定義することもできます。カスタム例外クラスは System.ApplicationException クラスを継承する必要があります。次の例は、カスタム例外クラスの使用を示しています。

 using System;

namespace it-kiso.com
{
    class Demo
    {
        static void Main(string[] args) 
        {
            TestUserDefinedException test = new TestUserDefinedException();
            try{
                test.validate(12);
            }catch(InvalidAgeException e){
                Console.WriteLine("InvalidAgeException: {0}", e);
            }
            Console.WriteLine("その他のコード");
        }
    }
}
public class InvalidAgeException : ApplicationException
{
   public InvalidAgeException (string message): base(message)
   {
   }
}
public class TestUserDefinedException
{
   public void validate(int age)
   {
      if(age < 18)
      {
         throw (new InvalidAgeException("申し訳ありませんが、年齢は18歳以上でなければなりません"));
      }
   }
} 

操作の結果は次のようになります。

InvalidAgeException: InvalidAgeException: 申し訳ありませんが、年齢は18歳以上でなければなりません
   TestUserDefinedException.validate(Int32 age)
   it-kiso.com.Demo.Main(String[] args)

例外をスローする

例外が System.Exception クラスから直接的または間接的に派生している場合は、catch ステートメント ブロックの throw ステートメントを使用して例外をスローできます。ここでのいわゆる例外のスローは、例外を再スローすることと理解できます。 throw ステートメントの構文は次のとおりです。

catch(Exception e) {
   …
   Throw e
}

「 C# 例外処理」についてわかりやすく解説!絶対に観るべきベスト2動画

例外処理 | C# |チュートリアル

Share via
Copy link