Практическое руководство. Использование определенных исключений в блоке Catch

При возникновении исключения, оно передается в стек и каждый блок Catch рассматривает возможность его обработки. Важен порядок операторов Catch. Размещайте блоки Catch, предназначенные для определенных исключений, до главного блока Catch исключений, в противном случае, компилятор может выдать ошибку. Соответствующий блок Catch определяется путем согласования типа исключения с именем исключения, указанным в этом блоке. Если нет специальных блоков Catch, то исключение перехватывается главным блоком Catch, если он существует.

В следующем примере кода блок try/catch используется для перехвата InvalidCastException. В примере создается класс с именем Employee с единственным свойством — уровень сотрудника (Emlevel). Метод , PromoteEmployee, принимает объект и повышает уровень сотрудника. Исключение InvalidCastException возникает, когда экземпляр DateTime передается методу PromoteEmployee.

Пример

Imports System

Public Class Employee
    'Create employee level property.
    Public Property Emlevel As Integer
        Get
            Return emlevelValue
        End Get
        Set
            emlevelValue = Value
        End Set
    End Property

    Private emlevelValue As Integer = 0
End Class

Public Class Ex13
    Public Shared Sub PromoteEmployee(emp As Object)
        'Cast object to Employee.
        Dim e As Employee = CType(emp, Employee)
        ' Increment employee level.
        e.Emlevel = e.Emlevel + 1
    End Sub

    Public Shared Sub Main()
        Try
            Dim o As Object = New Employee()
            Dim newyears As New DateTime(2001, 1, 1)
            'Promote the new employee.
            PromoteEmployee(o)
            'Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
            PromoteEmployee(newyears)
        Catch e As InvalidCastException
            Console.WriteLine("Error passing data to PromoteEmployee method. " + e.Message)
        End Try
    End Sub
End Class
using System;

public class Employee
{
    //Create employee level property.
    public int Emlevel
    {
        get
        {
            return(emlevel);
        }
        set
        {
            emlevel = value;
        }
    }

    private int emlevel = 0;
}

public class Ex13
{
    public static void PromoteEmployee(Object emp)
    {
        //Cast object to Employee.
        Employee e = (Employee) emp;
        // Increment employee level.
        e.Emlevel = e.Emlevel + 1;
    }

    public static void Main()
    {
        try
        {
            Object o = new Employee();
            DateTime newyears = new DateTime(2001, 1, 1);
            //Promote the new employee.
            PromoteEmployee(o);
            //Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
            PromoteEmployee(newyears);
        }
        catch (InvalidCastException e)
        {
            Console.WriteLine("Error passing data to PromoteEmployee method. " + e.Message);
        }
    }
}
using namespace System;

public ref class Employee
{
public:
    Employee()
    {
        emlevel = 0;
    }

    //Create employee level property.
    property int Emlevel
    {
        int get()
        {
            return emlevel;
        }
        void set(int value)
        {
            emlevel = value;
        }
    }

private:
    int emlevel;
};

public ref class Ex13
{
public:
    static void PromoteEmployee(Object^ emp)
    {
        //Cast object to Employee.
        Employee^ e = (Employee^) emp;
        // Increment employee level.
        e->Emlevel++;
    }

    static void Main()
    {
        try
        {
            Object^ o = gcnew Employee();
            DateTime^ newyears = gcnew DateTime(2001, 1, 1);
            //Promote the new employee.
            PromoteEmployee(o);
            //Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
            PromoteEmployee(newyears);
        }
        catch (InvalidCastException^ e)
        {
            Console::WriteLine("Error passing data to PromoteEmployee method. " + e->Message);
        }
    }
};

int main()
{
    Ex13::Main();
}

Среда CLR перехватывает исключения, которые не перехватываются блоком Catch. В зависимости от того, как настроена среда выполнения, появляется диалоговое окно отладки или выполнение программы прекращается и отображается диалоговое окно, содержащее сведения об исключении. Дополнительные сведения об отладке см. в разделе Отладка и профилирование приложений.

См. также

Задачи

Практическое руководство. Использование пробного блока и блока перехвата для перехвата исключений

Практическое руководство. Явное создание исключения

Практическое руководство. Создание пользовательских исключений

Практическое руководство. Использование блоков Finally

Основные понятия

Класс Exception и его свойства

Другие ресурсы

Основы обработки исключений