C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#の例外処理とは?try・catch・finally・throwの基本を実例付きで解説

例外(Exception)とは、プログラムの実行中に発生する問題のことです。C#における例外は、プログラムの稼働中に生じた例外的な状況——たとえば「ゼロによる除算」のような事態——への応答として捉えられます。

例外は、プログラム内のある部分から別の部分へ制御を移すための仕組みも提供しています。C#の例外処理は、以下の4つのキーワードを基盤として構築されています。

  • try — tryブロックは、特定の例外を監視対象とするコードブロックを示します。このブロックの後には、1つ以上のcatchブロックが続きます。

  • catch — 例外ハンドラーを使って例外を捕捉します。プログラムの中で問題を処理したい箇所にcatchキーワードを記述することで、発生した例外を受け取ることができます。

  • finally — finallyブロックは、例外がスローされたかどうかにかかわらず、必ず実行したい一連のステートメントを記述するために使用します。たとえば、ファイルを開いた場合、例外の有無にかかわらず確実に閉じる必要がありますね。

  • throw — プログラムは問題が発生した時点で例外をスローします。これにはthrowキーワードを使用します。

C#の例外はクラスとして表現されます。C#の例外クラスは、主にSystem.Exceptionクラスから直接または間接的に派生しています。代表的な派生クラスとしては、System.ApplicationExceptionSystem.SystemExceptionなどが挙げられます。

コード例1:リフレクションでメンバー情報を取得する

まずは、実際のコード例を見てみましょう。

using System;
using System.Reflection;
public class Demo {
    public static void Main(){
        Type type = typeof(Subject);
        try {
            FieldInfo fieldInfo = type.GetField("SubName");
            MemberInfo[] info = type.GetMember("SubName");
            Console.Write("Members = ");
            for (int i = 0; i < info.Length; i++)
                Console.WriteLine(" {0}", info[i]);
            Console.WriteLine("FieldInfo = {0}", fieldInfo);
        }
        catch (ArgumentNullException e){
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}
public class Subject{
    public string SubName = "Science";
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Members = System.String SubName
FieldInfo = System.String SubName

コード例2:ゼロ除算の例外を捕捉する

続いて、もうひとつ別の例を見てみましょう。こちらはゼロ除算が発生した際に、DivideByZeroExceptionをcatchブロックで捕捉し、finallyブロックで結果を出力するサンプルです。

using System;
public class Demo {
    int result;
    Demo() {
        result = 0;
    }
    public void division(int num1, int num2) {
        try {
            result = num1 / num2;
        }
        catch (DivideByZeroException e) {
            Console.WriteLine("Exception caught = {0}", e);
        }
        finally {
            Console.WriteLine("Result = {0}", result);
        }
    }
    public static void Main(string[] args) {
        Demo d = new Demo();
        d.division(100, 0);
    }
}

出力結果

このコードを実行すると、以下のように表示されます。

Exception caught = System.DivideByZeroException: Attempted to divide by zero.
    at Demo.division(Int32 num1, Int32 num2) in d:\Windows\Temp\n0kebv45.0.cs:line 11 
Result = 0

このように、100を0で割ろうとした瞬間にDivideByZeroExceptionがスローされ、catchブロックで捕捉されていることがわかります。また、例外の発生有無にかかわらずfinallyブロックが実行され、「Result = 0」という結果が出力されています。例外処理を適切に活用することで、予期しないエラーが発生してもプログラムを安全に動作させ続けることができます。

  1. JSPで例外を処理する方法:c:catchタグの使い方を徹底解説

    JSPアプリケーションを開発していると、実行時エラー(例外)が発生することがあります。JSTL(JSP Standard Tag Library)には、こうした例外を安全に捕捉するための<c:catch>タグが用意されています。このタグは、タグの本文内で発生したあらゆるThrowableオブジェクトを捕捉し、指定した変数に格納することができます。これにより、ページ全体がクラッシュするのを防ぎ、ユーザーにとって分かりやすい形でエラー処理を行うことが可能になります。c:catchタグの属性<c:catch>タグには以下の属性があります。属性説明必須デフォルト値var本文内の

  2. C++の例外処理入門!try・catch・throwの基本と標準例外クラス一覧

    C++における例外処理(Exception Handling)とは、プログラムの実行時に発生するエラー(ランタイムエラー)を適切に扱うための仕組みです。例外とは、実行時に送出(スロー)されるイベントのことで、C++ではすべての標準例外が std::exception クラスから派生しています。もし例外を捕捉しなかった場合、例外メッセージが出力され、プログラムは強制終了してしまいます。 C++標準では、例外関連のクラスが <exception> ヘッダに定義されており、プログラムの中で自由に利用できます。親子関係によるクラス階層は次のようになっています。 C++の主な標準例外クラス