Как продолжить выполнение кода после исключения? - PullRequest
7 голосов
/ 30 июля 2010

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

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, logging the error
  line 6  

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

Ответы [ 9 ]

11 голосов
/ 30 июля 2010

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

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 logging the error
  line 6  

Catch ex as Exception
   log(ex.tostring)
End Try
6 голосов
/ 22 апреля 2011

Использовать «Продолжить для»

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

    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
3 голосов
/ 30 июля 2010

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

Вместо этого я бы рекомендовал использовать Finally предложение блока Try..Catch..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
1 голос
/ 30 июля 2010
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 logging the error
catch ex as exception
   log(ex.tostring)
end try
try
  line 6  
catch ex as exception
end try
0 голосов
/ 15 марта 2019

В VB.NET вы можете использовать VISUAL BASIC 6.0 Код:

PRIVATE SUB PROCESO
ON ERROR GOTO VERERROR:
10: line1
20: line2 
30: line3
EXIT SUB
VERERROR:
MSGBOX("ERROR " & ERR.NUM & "." & ERR.DESCRIPTION)
RESUME NEXT 
'RESUME FOR RETRY
END SUB 

И вы можете использовать ERL () для просмотра ошибок записи строки перед кодом '10: '(o не писать эти числаэтикетки)

0 голосов
/ 05 ноября 2015

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

0 голосов
/ 30 октября 2014

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

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
0 голосов
/ 30 июля 2010

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

0 голосов
/ 30 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...