$ TryStatement = TRY StatementSequence
[EXCEPT ExceptionHandle]
[FINALLY StatementSequence] END TRY ";"
$ ExceptionHandle = ExceptionBlock [ExceptionBlock] [ELSE StatementSequence]
$ ExceptionBlock = ON { ident ":" } ClassType DO StatementSequence
Оператор Try … Except … Finally … End Try предназначен для обработки исключительных ситуаций, возникающих во время выполнения программы.
После ключевого слова Try указывается блок, при выполнении которого может возникнуть исключительная ситуация. Блок Except выполняется, если произошла исключительная ситуация. В данном блоке может содержаться блок кода, выполняемый в случае возникновения исключительной ситуации. Также в данном блоке могут содержаться блоки On...Do - это набор операторов, начинающихся с ключевого слова On это набор операторов, начинающихся с ключевого слова On, следом за которым указан тип обрабатываемого исключения: имя переменной, двоеточие и тип переменной - класс обрабатываемого исключения. Через указываемую переменную будет осуществляться доступ к информации об исключении.
Примечание. В качестве типа переменной указывается именно класс исключения, а не интерфейс, описывающий свойства этого класса. Если класс исключения не известен, то указывается базовый класс Exception. Список доступных для использования классов исключений приведен в подразделе «Системные классы исключительных ситуаций».
После ключевого слова Do указывается блок кода по обработке исключительной ситуации.
После фразы Else, если она присутствует, указывается последовательность действий, которые необходимо выполнить при обработке всех других исключений.
Блок Finally позволяет гарантированно выполнить некоторую последовательность операторов при выходе из блока Try ... End Try, независимо от результатов его выполнения. Данный блок выполняется всегда, вне зависимости от того была ли ошибка при выполнении операторов, указанных после ключевого слова Try, обрабатывалась ли ошибка каким-либо блоком Except, Except On, Else, либо в одном из блоков, следующих после Try, был вызван оператор Return.
Sub Main;
Var
a: Array[0..1] Of 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;
После выполнения примера будут обработаны две исключительные ситуации, возникающих при обращении к элементу с недопустимым индексом, и при обращении к несуществующему файлу. При обработке исключительной ситуации в консоль среды разработки будут выведены текст ошибки, идентификатор модуля/формы и номер строки, при выполнении которой произошла ошибка.
См. также: