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

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

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

Исключения могут возникать вследствие сбоя в коде разработчика, недоступности ресурсов операционной системы, либо при ошибочной работе объектов платформы. В языке 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, следом за которым указан тип обрабатываемого исключения: имя переменной, двоеточие и тип переменной - класс обрабатываемого исключения. Через указываемую переменную будет осуществляться доступ к информации об исключении.

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

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

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

Sub Main;
Var
    a: Array[0..1Of Integer;
    f: IFileStream;
Begin
    Try
        a[2] := 1;
    Except On e: IndexOutOfRangeException Do
        Debug.WriteLine(e.Line);
        Debug.WriteLine(e.Source);
        Debug.WriteLine(e.Message);
    End Try;
    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;

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

Обработка исключительных ситуаций при выполнении .NET-методов

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

Пример обработки исключительной ситуации, которая может возникнуть при выполнении пользовательского метода, реализованного в Fore.NET-сборке с идентификатором «UserAssm»:

Sub UserProc;
Var
    MB: IMetabase;
    Run: IForeNETRuntime;
    Asm: IForeNETRuntimeAssembly;
    Typ: IForeNETRuntimeType;
    TypInst: IForeNETRuntimeObjectInstance;
    v: Variant;
Begin
    MB := MetabaseClass.Active;
    Run := ForeNETAssemblyClass.Runtime;
    Asm := Run.Assembly(MB.ItemById("UserAssm").Bind As IForeNETAssembly);
    Typ := Asm.Type("UserAssm.UserClass");
    TypInst := Typ.CreateInstance;
    Try
        v := TypInst.InvokeMethod("Test", <Параметры метода>);
    Except On e: Exception Do
        Debug.WriteLine(e.Message);
    Finally
    End Try;
End Sub UserProc;

См. также:

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