Прочитать на английском

Поделиться через


ExceptionHandlingClause Класс

Определение

Представляет предложение в структурированном блоке обработки исключений.

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 предоставляет сведения о предложениях в try...catch... finally block (Try...Catch...Finally в Visual Basic). Чтобы получить список предложений обработки исключений в методе, получите MethodInfo объект , представляющий метод . Используйте метод для GetMethodBody получения MethodBody объекта , а затем используйте ExceptionHandlingClauses свойство для получения списка предложений.

Примечание

Работа с предложениями обработки исключений требует тщательного понимания метаданных и форматов инструкций msil. Сведения можно найти в документации по общеязыковой инфраструктуре (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

См. также раздел