Оператор Try... Catch... Finally (Visual Basic)
Обновлен: Ноябрь 2007
Позволяет, не прерывая выполнение программы, обрабатывать некоторые или все возможные ошибки, которые могут возникать в конкретном блоке кода.
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try
Компоненты
tryStatements
Необязательно. Один или несколько операторов, в которых может возникнуть ошибка. Могут использоваться составные операторы.Catch
Необязательно. Разрешено использование нескольких блоков Catch. Если исключение возникает при обработке блока Try, то каждая инструкция Catch сравнивается в текстовом порядке, чтобы определить обрабатывает ли она это исключение, с exception, представляющим исключение, которое возникло.exception
Необязательно. Любое имя переменной. Значение exception является значением возникшей ошибки. Используется оператором Catch для задания перехватываемой ошибки. Если аргумент опущен, инструкция Catch перехватывает все исключения.type
Необязательно. Указывает тип класса фильтра. Если значение exception относится к типу, указанному параметром type, или к типу, производному от него, данный идентификатор становится привязкой к объекту исключения.When
Необязательно. Инструкция Catch с предложением When перехватывает исключения, только если результат вычисления expression равен True. Предложение When используется только после проверки типа исключения, и expression может ссылаться на идентификатор, представляющий исключение.expression
Необязательно. Должен однозначно приводиться к типу Boolean. Любое выражение, которое описывает универсальный фильтр. Обычно используется для фильтрации по номеру ошибки. Используется с зарезервированным словом When для определения условий, при которых будет перехватываться данная ошибка.catchStatements
Необязательно. Операторы обработки ошибок, возникших в соответствующем блоке Try. Могут использоваться составные операторы.Exit Try
Необязательно. Зарезервированное слово, которое разбивает структуру Try...Catch...Finally. Выполнение возобновляется с кода, непосредственно следующего за оператором End Try. Инструкция Finally будет по-прежнему выполняться. Не допускается в блоках Finally.Finally
Необязательно. Блок Finally всегда выполняется по окончании выполнения любой части оператора Try.finallyStatements
Необязательно. Операторы, выполняемые после выполнения всех остальных действий по обработке ошибки.End Try
Завершает структуру Try...Catch...Finally.
Заметки
Локальные переменные блока Try недоступны в блоке Catch, поскольку это отдельные блоки. Если нужно использовать переменную в нескольких блоках, то следует объявить ее вне структуры Try...Catch...Finally.
Блок Try содержит код, в котором может возникнуть ошибка, а в блоке Catch содержится код обработки любой возникшей ошибки. Если ошибка возникла в блоке Try, то управление программой передается соответствующему блоку Catch. Аргумент exception представляет собой экземпляр класса Exception или класса, производного от класса Exception. Экземпляр класса Exception соответствует возникшей в блоке Try ошибке. Экземпляр содержит сведения об ошибке. Это включает среди прочего ее номер и сообщение.
Если в инструкции Catch не указан аргумент exception, то она перехватывает любые исключения системы или приложения. Нужно всегда использовать этот вариант в качестве последнего блока Catch в структуре Try...Catch...Finally после перехвата всех определенных исключений. Поток управления никогда не может достичь блока Catch, который следует за блоком Catch без аргумента exception.
В случаях частичного доверия, например, в приложении, размещенном в сетевом ресурсе, Try...Catch...Finally не перехватит исключения системы безопасности, возникающие перед обращением к методу, содержащему вызов. В следующем примере, если поместить его на общем ресурсе сервера и запустить оттуда, то возникнет ошибка « System.Security.SecurityException: Request Failed." Дополнительные сведения о ошибках безопасности см. в описании класса SecurityException.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Try
Process.Start("https://www.microsoft.com")
Catch ex As Exception
MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try
End Sub
В таких случаях частичного доверия необходимо поместить инструкцию Process.Start в отдельную Sub. Начальный вызов Sub не удастся. Это позволяет Try...Catch перехватить вызов перед началом выполнения Sub, которая содержит Process.Start, и создаст исключение безопасности.
Примечание. |
---|
Если инструкция Try не содержит ни одного блока Catch, то она должна содержать Finally. |
Пример
Следующий упрощенный пример иллюстрирует структуру Try...Catch...Finally:
Public Sub TryExample()
Dim x As Integer = 5 ' Declare variables.
Dim y As Integer = 0
Try ' Set up structured error handling.
x = x \ y ' Cause a "Divide by Zero" error.
Catch ex As Exception When y = 0 ' Catch the error.
Beep()
MsgBox("You tried to divide by 0.") ' Show an explanatory message.
Finally
Beep() ' This line is executed no matter what.
End Try
End Sub