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

Последнее обновление: 30.10.2015

В процессе выполнения программы нередко возникают такие ситуации, которые трудно или даже невозможно предусмотреть во время создания программы. Например, при передаче файла по сети может неожиданно оборваться сетевое подключение. Такие ситуации называются исключениями. Чтобы программа неожиданно не зависла в таких ситуациях, программисту нужно вводить в нее обработку исключений. Для обработки исключений в языке VB.NET имеется конструкция Try...Catch..Finally. Ее использование выглядит следующим образом:

Sub Main()

	Dim a(3) As Integer

	Try
		a(5) = 3
    Catch ex As Exception
        Console.WriteLine(ex.Message)
    Finally
        Console.WriteLine("Finally block")
    End Try
        
    Console.ReadLine()
End Sub

В данном случае у нас как раз и возникает исключение, так как в массиве a только 4 элемента, а мы пытаемся присвоить значение шестому элементу. При использовании блока Try...Catch..Finally сначала выполняются все инструкции между операторами Try и Catch. И если вдруг в каком-то месте кода возникает исключение, то обычный порядок выполнения кода останавливается и программа переходит к выражению Catch. Это выражение имеет следующий синтаксис: Catch имя_переменной As тип_исключения. В данном случае у нас объявляется переменная ex, которая имеет тип Exception. При чем если возникшее исключение не является исключением типа, указанного в выражении Catch, то оно не обрабатывается, а программа просто зависает или выбрасывает сообщение об ошибке. Так как тип Exception является базовым типом для всех исключений, то в выражении Catch ex As Exception абсолютно все исключения.

В нашем случае мы просто выводим сообщение об исключении на экран с помощью свойства Message, определенное в классе Exception. Далее в любом случае выполняется блок после оператора Finally. Но этот блок необязательный, и его можно при обработке исключений опускать.

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

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

Мы можем создать свои собственные классы исключений, которые будут обрабатывать нежелательные ситуации. Для примера возьмем класс Algorithm, который мы сделали в одной из глав предыдущей части:

Public Class Algorithm

    Public Shared Function Factorial(x As Integer) As Integer
        If (x = 1) Then
            Return 1
        Else
            Return x * Factorial(x - 1)
        End If
    End Function

    Public Shared Function Fibbonachi(x As Integer) As Integer
        If x = 0 Then
            Return 1
        ElseIf x = 1 Then
            Return 1
        Else
            Return Fibbonachi(x - 1) + Fibbonachi(x - 2)
        End If
    End Function

End Class

Факториал и последовательность Фиббоначи определены только для положительных чисел, поэтому если мы передадим в функцию отрицательное число, возникнет исключительная ситуация. Чтобы ее обработать и создадим класс NegativeNumberException:

Public Class NegativeNumberException
    Inherits Exception
    Sub New()
        MyBase.New("В качестве параметра передано отрицательное число")
    End Sub
End Class

В этом классе по сути мы только передаем сообщение в конструктор базового класса. Теперь вызовем обработку исключения в методе Factorial с помощью ключевого слова Throw:

Public Shared Function Factorial(x As Integer) As Integer
    If x < 0 Then Throw New NegativeNumberException()
    If (x = 1) Then
        Return 1
    Else
        Return x * Factorial(x - 1)
    End If
End Function

И теперь, если мы передадим в этот метод отрицательные значения, в блоке Try...Catch будет обрабатываться исключение NegativeNumberException:

Try
    Console.WriteLine(Algorithm.Factorial(-1))
Catch ex As Exception
    Console.WriteLine(ex.Message)
End Try
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850