2010-07-29 2 views
6

Я хотел бы знать, есть ли способ, чтобы программа продолжалась после того, как выбрано исключение. Например:Продолжить код после исключения

Try 
    line 1 
    line 2 
    line 3 
    line 4 (here the exception is thrown and jumps to the catch) 
    line 5 <-- i would like the program to continue its execution loging the error 
    line 6 

Catch ex as Exception 
    log(ex.tostring) 
End Try 

Спасибо.

ответ

10

Если вы делаете что-то, что вы знаете, как восстановить или, что не является жизненно важным, вы должны обернуть только эту строку в Try/улове с конкретным уловом. , например.

Try 
    line 1 
    line 2 
    line 3 
    Try 
    line 4 (here the exception is throw and jumps to the catch) 
    Catch iox as IOException ' or whatever type is being thrown 
    'log it 
    End Try 
    line 5 <-- i would like the program to continue its execution after loggin the error 
    line 6 

Catch ex as Exception 
    log(ex.tostring) 
End Try 
0

VB.net не поддерживает этот тип конструкции. Как только исключение разворачивает стек, его нельзя отменить назад. Некоторые языки разрешают вам возобновить исключение, но для этого требуется более сложное управление стеком - в основном сопрограммы.

0
try 
    line 1 
catch ex as exception 
    log(ex.tostring) 
end try 
try 
    line 2 
catch ex as exception 
    log(ex.tostring) 
end try 
try 
    line 3 
catch ex as exception 
    log(ex.tostring) 
end try 
try 
    line 4 (here the exception is throw and jumps to the catch) 
catch ex as exception 
    log(ex.tostring) 
end try 
try 
    line 5 <-- i would like the program to continue its execution after loggin the error 
catch ex as exception 
    log(ex.tostring) 
end try 
try 
    line 6 
catch ex as exception 
end try 
+7

Чувствуете ли вы необходимость принимать душ после ввода? :) –

+0

все ... вы избили меня до этого :) , и если вам не хотелось создавать все блоки try-catch, всегда есть страшный оператор goto. Но я бы не предложил этого! –

+0

Уфф хорошо кажется, что это единственный способ пойти .. спасибо – carlos

3

Хотя On Error Resume Next является still available in VB.NET, это является взаимоисключающим с предпочтительным методом структурированной обработки исключений.

Вместо этого, я бы рекомендовал использовать пункт в Try..Catch..Finally блока Finally для обеспечения Line 5 and Line 6 получить выполняются, даже если линия 4 (или любая предыдущая строка) бросков.

Try 
    line 1 
    line 2 
    line 3 
    line 4 
Catch ex as Exception 
    log(ex.tostring) 
Finally 
    line 5 
    line 6 
End Try 
+0

В этом случае исключение составляет couse путем преобразования dbnull в int после чтения с дБ ... но это было всего лишь одним из данных многих других, и именно поэтому я хотел продолжать читать. Спасибо! для комментариев! – carlos

0

Если я не ошибаюсь, «Лучшие практики для обработки исключений,» говорит, что если вы можете проверить на ошибки, которые, вероятно, происходят тогда проверить для этого условия. Если вы можете проверить dbnull, тогда сделайте это.

6

Используйте «Продолжить Для»

Не хорошая практика во всем мире, но полезно в некоторых случаях, например найти файл во время обработки отказано в доступе к некоторым каталогам:

Dim dir As New DirectoryInfo("C:\") 
    Dim strSearch As String = ("boot.ini") 

    For Each SubDir As DirectoryInfo In dir.GetDirectories 
     Try 
      For Each File As FileInfo In SubDir.GetFiles 
       Console.WriteLine("Sub Directory: {0}", SubDir.Name) 
       If File.Name = strSearch Then 
        Console.Write(File.FullName) 
       End If 
      Next 
     Catch ex As Exception 
      Console.WriteLine(ex.Message) 
      Continue For 
     End Try 
    Next 
0

Вот пример кода:

Sub yourSub() 
    Dim cDelegate As CatchDelegate = Sub(ex As Exception) 
             Your Catch Code 
            End Sub 
line 1 
line 2 
line 3 
TCResumeNext(Sub() line 4, cDelegate) 
line 5 
line 6 
End Sub 

Delegate Sub CatchDelegate(e As Exception) 

Sub TCResumeNext(tryDelegate As [Delegate], catchDelgate As CatchDelegate) 
    Try 
    tryDelegate.DynamicInvoke() 
    Catch ex As Exception 
     catchDelgate.DynamicInvoke(ex) 
    End Try 
End Sub 
-1

довольно старый пост, но ради других. лично я буду использовать «on error resume next», в этом случае это необходимо зло

+1

Ни один профессиональный разработчик никогда не будет использовать «on error resume next» в любой ситуации. Как только вы используете эту ошибку ALL, просто игнорируются ..... Грубо переведя ее, значит: «У меня ошибка, и мне все равно» .... – Monty

Смежные вопросы