例外のスロー

実行するようにデザインされている処理をメンバが正しく実行できなかった場合、例外がスローされます。これを実行エラーと言います。たとえば、Connect メソッドが、指定されたリモート エンド ポイントに接続できなかった場合は実行エラーであり、例外がスローされます。

以下のガイドラインに従うと、適切に例外をスローできます。

エラー コードは返さないでください。例外は、フレームワークでエラーを報告するための主要な手段です。

例外のデザインのガイドライン」では、例外を使用することから得られるさまざまな利点について説明しています。

例外をスローして実行エラーを報告してください。実行するようデザインされている処理をメンバが正しく実行できなかった場合は実行エラーと見なし、例外をスローする必要があります。

実行の継続が危険な状況にコードが遭遇した場合は、例外をスローする代わりに System.Environment.FailFast(System.String) (.NET Framework Version 2.0 の機能) を呼び出してプロセスを終了することを検討してください。

通常の制御フローでは、できれば例外を使用しないでください。システム エラーや競合状態が発生する可能性がある操作を除き、フレームワークのデザイン時には、例外をスローしないコードをユーザーが記述できるように API をデザインする必要があります。たとえば、メンバを呼び出す前に状態をチェックできるようにすると、例外をスローしないコードをユーザーが記述できるようになります。

次のコード例は、メッセージ文字列が null (Visual Basic では Nothing) の場合に例外がスローされないようにテストする方法を示しています。

public class Doer
{
    // Method that can potential throw exceptions often.
    public static void ProcessMessage(string message)
    {
        if (message == null)
        {
            throw new ArgumentNullException("message");
        }
    }
    // Other methods...
}

public class Tester
{
    public static void TesterDoer(ICollection<string> messages)
    {
        foreach (string message in messages)
        {
            // Test to ensure that the call 
            // won't cause the exception.
            if (message != null)
            {
                Doer.ProcessMessage(message);
            }
        }
    }
}

スローされる例外の数を削減できるデザイン パターンの詳細については、「例外とパフォーマンス」を参照してください。

例外をスローすることによるパフォーマンスへの影響を考慮してください。

システム エラーではなく、メンバ コントラクトの違反が原因で、パブリックに呼び出し可能なメンバによってスローされる例外をすべて記録し、それらをコントラクトの一部として扱ってください。コントラクトに含まれる例外は、バージョン間で変更しないでください。

オプションによって例外をスローしたりしなかったりするようなパブリック メンバを使用しないでください。

たとえば、次のようなメンバは定義しないでください。

Uri ParseUri(string uriValue, bool throwOnError)

戻り値または out パラメータとして例外を返すパブリック メンバを使用しないでください。

このガイドラインの対象は、パブリックに参照可能なメンバです。プライベートなヘルパー メソッドを使用して例外を構築し、初期化することは許容されます。

例外ビルダ メソッドを使用することを検討してください。同じ例外を異なる場所からスローすることはよくあります。コードが長くなることを避けるには、例外を作成し、そのプロパティを初期化するヘルパー メソッドを使用します。

ヘルパー メソッドからは例外をスローしないでください。例外をスローすると、例外を発生させた呼び出し履歴がスタック トレースに正確に反映されません。

例外フィルタ ブロックから例外をスローしないでください。例外フィルタで例外が発生すると、その例外は共通言語ランタイムでキャッチされ、フィルタから false が返されます。この動作は、フィルタが実行し、false を明示的に返す動作と区別できないため、デバッグが困難です。

C# などの一部の言語は、例外フィルタをサポートしません。

finally ブロックから例外を明示的にスローするのは避けてください。例外をスローするメソッドを呼び出した結果、暗黙にスローされる例外は許容されます。

Portions Copyright 2005 Microsoft Corporation.All rights reserved.

Portions Copyright Addison-Wesley Corporation.All rights reserved.

デザイン ガイドラインの詳細については、2005 年に Addison-Wesley から出版されている Krzysztof Cwalina、Brad Abrams 共著の『Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries』を参照してください。

参照

概念

スローする正しい種類の例外の選択

その他の技術情報

クラス ライブラリ開発のデザイン ガイドライン
例外のデザインのガイドライン