閱讀英文版本

分享方式:


ExceptionHandlingClause 類別

定義

表示結構化例外狀況處理 (Structured Exception Handling) 區塊中的子句。

C#
public class ExceptionHandlingClause
C#
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ExceptionHandlingClause
C#
[System.Runtime.InteropServices.ComVisible(true)]
public class ExceptionHandlingClause
繼承
ExceptionHandlingClause
屬性

範例

下列程式代碼範例會定義名為 MethodBodyExample的測試方法,並顯示其局部變數資訊和例外狀況處理子句。 方法 MethodBase.GetMethodBody 可用來取得 MethodBody 測試方法的物件。 屬性 ExceptionHandlingClauses 可用來取得物件清單 ExceptionHandlingClause ,並顯示其屬性。

您可以使用 Ildasm.exe 檢查 MSIL 中的已編譯程式代碼範例,以查看如何計算位移和長度。

此程式代碼是位於類別主題中較大範例的 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

備註

類別ExceptionHandlingClause提供 ...catchtry子句的相關信息... finally 區塊 (Try...Catch...Finally 在 Visual Basic) 。 若要取得方法中的例外狀況處理子句清單,請取得 MethodInfo 代表 方法的 。 GetMethodBody使用 方法來取得 MethodBody 對象,然後使用 ExceptionHandlingClauses 屬性來取得 子句清單。

備註

使用例外狀況處理子句需要徹底了解元數據和 Microsoft 中繼語言, (MSIL) 指令格式。 您可以在 Common Language Infrastructure (CLI) 檔中找到資訊,特別是「數據分割 II:元數據定義和語意」。

建構函式

ExceptionHandlingClause()

初始化 ExceptionHandlingClause 類別的新執行個體。

屬性

CatchType

取得這個子句所處理之例外狀況的類型。

FilterOffset

取得在使用者提供之篩選條件程式碼的方法主體中的位移,以位元組為單位。

Flags

取得值,指出這個例外狀況處理子句是 finally 子句、型別篩選的子句或是使用者篩選的子句。

HandlerLength

取得這個例外狀況處理子句的主體長度,以位元組為單位。

HandlerOffset

取得在這個例外狀況處理子句之方法主體中的位移,以位元組為單位。

TryLength

包含這個例外狀況處理子句之 try 區塊的總長度,以位元組為單位。

TryOffset

在包含這個例外狀況處理子句之 try 區塊的方法中的位移,以位元組為單位。

方法

Equals(Object)

判斷指定的物件是否等於目前的物件。

(繼承來源 Object)
GetHashCode()

做為預設雜湊函式。

(繼承來源 Object)
GetType()

取得目前執行個體的 Type

(繼承來源 Object)
MemberwiseClone()

建立目前 Object 的淺層複製。

(繼承來源 Object)
ToString()

例外狀況處理子句的字串表示。

適用於

產品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.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

另請參閱