Обработка пользовательских исключений в консольных приложениях VB.net - PullRequest
1 голос
/ 14 февраля 2012

Я работаю над приложением, которое я унаследовал, в котором есть много слишком широких исключений, оно использует блоки try / catch, но полностью игнорирует исключение (в большинстве случаев) и переходит через него. Я хотел бы обернуть в лучшую модель пользовательских исключений, но само мое пользовательское исключение продолжает возвращаться необработанным. Как мне создать исключение, которое я могу зарегистрировать, и пометить исключение как обработанное, чтобы продолжить выполнение?

В этом примере я попадаю в блок finally и попадаю в ExpectedExeptionType. Однако он по-прежнему создает необработанное исключение, которое останавливает выполнение потока с помощью всплывающего окна. Есть ли способ для меня, чтобы выбросить исключение, использовать его для регистрации сообщения и продолжить обработку (считать мое исключение как его обработку)?

Пример:

Module Module1

Sub Main()

    Dim a As Integer
    Console.WriteLine("Please enter an integer and then press enter.")
    Try
        a = Console.ReadLine()
        Console.WriteLine("You entered the value " & a.ToString)
        Console.WriteLine("Press enter to continue")
        Console.ReadLine()
    Catch ex As Exception            
        Throw New ExpectedExceptionType("Bad")            
    Finally
        'Clean up objects/whatever and continue
        Console.WriteLine("TEST")
        Console.ReadLine()
    End Try

    Console.WriteLine("Hi there, press enter to exit!")
    Console.ReadLine()
End Sub

Public Class ExpectedExceptionType
    Inherits Exception

    Public Sub New()            
    End Sub

    Public Sub New(ByVal Message As String)
        MyBase.New(Message)
        Console.WriteLine("I know I'm getting into the exception.")
    End Sub

    Public Sub New(ByVal Message As String, ByVal Inner As Exception)
        MyBase.New(Message)
    End Sub

End Class

Конечный модуль

1 Ответ

0 голосов
/ 14 февраля 2012

В Catch вы бросаете ExpectedExceptionType, но никогда не обрабатываете его.Допустим, у вас был такой код:

Sub Main()
    Try
        MethodWhichCanThrow()
    Catch ex as ExpectedExceptionType
        'Log exception here, but don't stop execution
        Console.WriteLine("Expected exception: " & ex.ToString())
    End Try
    'Some more code here
End Sub

Sub MethodWhichCanThrow()
    If someCondition Then
        Throw New ExpectedExceptionType("This error is expected")
    End If
    'Do something if there's no error here
End Sub

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

Я будутакже добавьте, что если ожидается некоторое состояние ошибки, и если возможно проверить эту ошибку с помощью какого-либо метода, который не генерирует ошибку, предпочтительно использовать этот метод.Например, это:

Dim number As Integer
If Integer.TryParse(value, number) Then
    Console.WriteLine("Converted '{0}' to {1}.", value, number)
Else
    Console.WriteLine("Conversion failed")
End If 

... предпочтительнее этого:

Dim number As Integer
Try
    number = Int32.Parse(value)
    Console.WriteLine("Converted '{0}' to {1}.", value, number)
Catch e As FormatException
    Console.WriteLine("Conversion failed")
End Try

В этом случае версия try-catch не так уж плоха, но вам все равно придетсязнать, какой тип исключения выдается, и в каком случае.Кроме того, в реальном коде, имеющем много операторов try-catch, становится труднее следовать коду.

...