英語で読む

次の方法で共有


ExceptionHandlingClauseOptions 列挙型

定義

例外処理句の種類を識別します。

この列挙体は、メンバー値のビットごとの組み合わせをサポートしています。

C#
[System.Flags]
public enum ExceptionHandlingClauseOptions
C#
[System.Flags]
[System.Runtime.InteropServices.ComVisible(true)]
public enum ExceptionHandlingClauseOptions
継承
ExceptionHandlingClauseOptions
属性

フィールド

名前 説明
Clause 0

この句は、指定した型から派生するすべての例外を受け入れます。

Fault 4

この句は、通常の制御フローの完了時ではなく、例外が発生した場合に実行されます。

Filter 1

この句は、例外を無視するか (つまり、正常実行を再開するかどうか)、関連付けられているハンドラーで処理するか、または次の句に渡すかを判断するユーザー指定の命令を格納します。

Finally 2

この句は、通常の制御フローまたは処理できない例外の発生を通じて、try ブロックが終了するたびに実行されます。

次のコード例では、 という名前 MethodBodyExampleのテスト メソッドを定義し、そのローカル変数情報と例外処理句を表示します。 メソッドは MethodBase.GetMethodBody 、テスト メソッドのオブジェクトを MethodBody 取得するために使用されます。 プロパティは ExceptionHandlingClauses 、オブジェクトの ExceptionHandlingClause 一覧を取得し、そのプロパティを表示するために使用されます。

このコードは、 クラスに対して提供されるより大きな例の MethodBody 一部です。

C#
using System;
using System.Reflection;

public class Example
{
    public static void Main()
    {
        // Get method body information.
        MethodInfo mi = typeof(Example).GetMethod("MethodBodyExample");
        MethodBody mb = mi.GetMethodBody();
        Console.WriteLine("\r\nMethod: {0}", mi);

        // Display the general information included in the
        // MethodBody object.
        Console.WriteLine("    Local variables are initialized: {0}",
            mb.InitLocals);
        Console.WriteLine("    Maximum number of items on the operand stack: {0}",
            mb.MaxStackSize);
C#

// Display exception handling clauses.
Console.WriteLine();
foreach (ExceptionHandlingClause ehc in mb.ExceptionHandlingClauses)
{
    Console.WriteLine(ehc.Flags.ToString());

    // The FilterOffset property is meaningful only for Filter
    // clauses. The CatchType property is not meaningful for
    // Filter or Finally clauses.
    switch (ehc.Flags)
    {
        case ExceptionHandlingClauseOptions.Filter:
            Console.WriteLine("        Filter Offset: {0}",
                ehc.FilterOffset);
            break;
        case ExceptionHandlingClauseOptions.Finally:
            break;
        default:
            Console.WriteLine("    Type of exception: {0}",
                ehc.CatchType);
            break;
    }

    Console.WriteLine("       Handler Length: {0}", ehc.HandlerLength);
    Console.WriteLine("       Handler Offset: {0}", ehc.HandlerOffset);
    Console.WriteLine("     Try Block Length: {0}", ehc.TryLength);
    Console.WriteLine("     Try Block Offset: {0}", ehc.TryOffset);
}
C#
    }

    // The Main method contains code to analyze this method, using
    // the properties and methods of the MethodBody class.
    public void MethodBodyExample(object arg)
    {
        // Define some local variables. In addition to these variables,
        // the local variable list includes the variables scoped to
        // the catch clauses.
        int var1 = 42;
        string var2 = "Forty-two";

        try
        {
            // Depending on the input value, throw an ArgumentException or
            // an ArgumentNullException to test the Catch clauses.
            if (arg == null)
            {
                throw new ArgumentNullException("The argument cannot be null.");
            }
            if (arg.GetType() == typeof(string))
            {
                throw new ArgumentException("The argument cannot be a string.");
            }
        }

        // This filter clause selects only exceptions that derive
        // from the ArgumentException class.
        // Other exceptions, including ArgumentException itself,
        // are not handled by this filter clause.
        catch (ArgumentException ex) when (ex.GetType().IsSubclassOf(typeof(ArgumentException)))
        {
            Console.WriteLine("Filter clause caught: {0}", ex.GetType());
        }

        // This catch clause handles the ArgumentException class, and
        // any other class derived from Exception.
        catch(Exception ex)
        {
            Console.WriteLine("Ordinary exception-handling clause caught: {0}",
                ex.GetType());
        }
        finally
        {
            var1 = 3033;
            var2 = "Another string.";
        }
    }
}

// This code example produces output similar to the following:
//
//Method: Void MethodBodyExample(System.Object)
//    Local variables are initialized: True
//    Maximum number of items on the operand stack: 2
C#
//
//Filter
//      Filter Offset: 71
//      Handler Length: 23
//      Handler Offset: 116
//      Try Block Length: 61
//      Try Block Offset: 10
//Clause
//    Type of exception: System.Exception
//       Handler Length: 21
//       Handler Offset: 70
//     Try Block Length: 61
//     Try Block Offset: 9
//Finally
//       Handler Length: 14
//       Handler Offset: 94
//     Try Block Length: 85
//     Try Block Offset: 9

注釈

メソッドの例外処理句を調べるには、 オブジェクトを取得し、 メソッドをMethodInfoGetMethodBody呼び出してメソッド本体を取得します。 オブジェクトの ExceptionHandlingClauses 一覧 ExceptionHandlingClause を取得するには、 プロパティを使用します。

注意

例外処理句を操作するには、メタデータと Microsoft 中間言語 (MSIL) 命令形式を十分に理解する必要があります。 情報については、 共通言語インフラストラクチャ (CLI) のドキュメント(特にパーティション II: メタデータ定義とセマンティクス)を参照してください。

適用対象

製品 バージョン
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

こちらもご覧ください