ExceptionHandlingClauseOptions Wyliczenie

Definicja

Identyfikuje rodzaje klauzul obsługi wyjątków.

To wyliczenie obsługuje bitową kombinację jego wartości składowych.

C#
[System.Flags]
public enum ExceptionHandlingClauseOptions
C#
[System.Flags]
[System.Runtime.InteropServices.ComVisible(true)]
public enum ExceptionHandlingClauseOptions
Dziedziczenie
ExceptionHandlingClauseOptions
Atrybuty

Pola

Nazwa Wartość Opis
Clause 0

Klauzula akceptuje wszystkie wyjątki pochodzące z określonego typu.

Fault 4

Klauzula jest wykonywana, jeśli wystąpi wyjątek, ale nie po zakończeniu normalnego przepływu sterowania.

Filter 1

Klauzula zawiera instrukcje określone przez użytkownika, które określają, czy wyjątek powinien być ignorowany (czyli czy normalne wykonywanie powinno zostać wznowione), obsługiwane przez skojarzoną procedurę obsługi lub przekazywane do następnej klauzuli.

Finally 2

Klauzula jest wykonywana za każdym razem, gdy blok try zakończy działanie, niezależnie od tego, czy jest to normalny przepływ sterowania, czy też z powodu nieobsługiwanego wyjątku.

Przykłady

Poniższy przykład kodu definiuje metodę testową o nazwie MethodBodyExamplei wyświetla informacje o zmiennej lokalnej oraz klauzule obsługi wyjątków. Metoda MethodBase.GetMethodBody służy do uzyskiwania MethodBody obiektu dla metody testowej. Właściwość ExceptionHandlingClauses służy do uzyskiwania listy obiektów i wyświetlania ExceptionHandlingClause ich właściwości.

Ten kod jest częścią większego przykładu udostępnionego MethodBody dla klasy.

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

Uwagi

Aby zbadać klauzule obsługi wyjątków w metodzie, uzyskaj obiekt i wywołaj GetMethodBody metodę MethodInfo w celu uzyskania treści metody. ExceptionHandlingClauses Użyj właściwości , aby uzyskać listę ExceptionHandlingClause obiektów.

Uwaga

Praca z klauzulami obsługi wyjątków wymaga dokładnego zrozumienia metadanych i formatów instrukcji języka pośrednich firmy Microsoft (MSIL). Informacje można znaleźć w dokumentacji infrastruktury języka wspólnego (CLI), zwłaszcza "Partition II: Metadata Definition and Semantics" (Partycja II: definicja metadanych i semantyka).

Dotyczy

Produkt Wersje
.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

Zobacz też