Исключительные ситуации

Исключение - это любое ошибочное поведение, наблюдающееся при выполнении прикладного кода.

Причины возникновения исключительных ситуаций

Исключения могут возникать вследствие сбоя в коде разработчика, недоступности ресурсов операционной системы, при ошибочной работе объектов платформы или по каким-либо другим причинам. В языке Fore для работы с исключительными ситуациями реализован класс Exception. Объект класса Exception создаётся для представления исключения при его возникновении. Исключение передается в стек до тех пор, пока его не обработает приложение или не завершится выполнение кода. Класс Exception имеет ряд свойств, облегчающих анализ исключения. Большая часть классов, унаследованных от Exception, не реализуют дополнительные свойства и методы, поэтому наиболее важные сведения об исключении можно найти в иерархии наследования исключения, в имени исключения и в информации, содержащейся в этом исключении.

Оператор Raise предоставляет возможность разработчику самому в нужный момент времени генерировать исключительную ситуацию.

Sub Main;
Begin
    
Try
        
Raise New Exception.Create("Исключение");
    
Except On e: Exception Do
        Debug.WriteLine(
"Блок Except. Текст сообщения:");
        Debug.WriteLine(e.Message);
    
End Try;
End Sub Main;

Обработка исключительных ситуаций

Для обработки исключений используется оператор Try…Except…Finally…End Try. После ключевого слова Try указывается блок, при выполнении которого может произойти исключительная ситуация.

Блок Except выполняется, если произошла исключительная ситуация. В данном блоке может содержаться код, обрабатывающий исключительную ситуацию. Также в данном блоке могут содержаться блоки On...Do - это набор операторов, предназначенный для обработки исключительной ситуации определенного вида. Блок начинается с ключевого слова On, следом за которым указывается класс обрабатываемого исключения. Перед классом также может быть указана переменная, через которую будет осуществляться доступ к информации об исключении. Переменная и класс разделяются двоеточием. После ключевого слова Do указывается блок кода для обработки исключительной ситуации.

Примечание. В качестве типа переменной указывается именно класс исключения, а не интерфейс, описывающий свойства/методы этого класса. Если класс исключения не известен, то указывается базовый класс Exception. Список доступных для использования классов исключений приведен в подразделе «Системные классы исключительных ситуаций».

Пример формирования обработчиков Try…Except…Finally…End Try:

Sub Main;
Begin
    Try
        // Код, вызов которого может привести к ошибке
    Except
        // Обработка ошибок всех видов
    End Try;
    Try
        // Код, вызов которого может привести к ошибке
    Except On Exception Do
        // Обработка ошибок всех видов
    End Try;
    Try
        // Код, вызов которого может привести к ошибке
    Except
        On ArgumentOutOfRangeException Do
        //...
        On e: IndexOutOfRangeException Do
        //...
    End Try;
End Sub Main;

Блок Finally позволяет гарантированно выполнить некоторую последовательность операторов при выходе из блока независимо от результатов его выполнения.

Sub Main;
Var
    f: IFileStream;
Begin
    Try
        f := File.Open("c:\fileabcxyz666.txt", FileOpenMode.Read, FileShare.Exclusive);
    Except On e: FileNotFoundException Do
        Debug.WriteLine(e.Line);
        Debug.WriteLine(e.Source);
        Debug.WriteLine(e.Message);
    Finally
        Debug.WriteLine("Данный блок выполняется всегда");
    End Try;
End Sub Main;

При выполнении примера будет обработана исключительная ситуация, возникающая при обращении к несуществующему файлу. При обработке исключительной ситуации в консоль среды разработки будут выведены текст ошибки, идентификатор модуля/формы и номер строки, при выполнении которой произошла ошибка. После этого выполняется код, указанный в блоке Finally.

См. также:

Руководство по языку Fore | Системные классы исключительных ситуаций