2010-07-29 25 views
6

Ich möchte wissen, ob es eine Möglichkeit gibt, das Programm fortzusetzen, nachdem eine Ausnahme ausgelöst wurde. Zum Beispiel:Code nach Exception fortsetzen

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 

Danke.

Antwort

10

Wenn Sie etwas zu tun haben, dass Sie wissen, wie zu erholen oder das ist nicht von entscheidender Bedeutung, sind Sie nur diese Zeile in der try/catch mit einem bestimmten Fang wickeln soll. z.B.

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 unterstützt diese Art von Konstrukt nicht. Sobald die Ausnahme den Stapel abwickelt, kann er nicht mehr zurückgespult werden. Einige Sprachen erlauben es Ihnen, die Ausnahme fortzusetzen, aber sie erfordern komplexere Stack-Verwaltung - im Wesentlichen Koroutinen.

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

Hatten Sie das Bedürfnis, eine Dusche nach der Eingabe zu nehmen? :) –

+0

aww ... du schlägst mich dazu :) und wenn du nicht Lust hast, alle try-catch Blöcke zu erstellen, gibt es immer die gefürchtete goto Aussage. Aber ich würde das nicht vorschlagen! –

+0

uff und es scheint, es ist der einzige Weg zu gehen .. danke – carlos

3

Obwohl On Error Resume Nextstill available in VB.NET ist, um es in der bevorzugten Methode der strukturierten Ausnahmebehandlung gegenseitig ausschließen.

Stattdessen würde ich die Verwendung der Finally Klausel eines Try..Catch..Finally Block empfehlen, um sicherzustellen, Line 5 and Line 6 sogar noch ausgeführt werden, wenn die Linie 4 (oder einer der vorhergehende Line) führt.

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

In diesem Fall ist die Ausnahme durch eine dbnullconversion zu int nach dem Lesen von einem dB ... aber das war nur eine Daten von vielen anderen, und deshalb wollte ich weiter lesen .. Danke !! für die Kommentare! – carlos

0

Wenn ich nicht den „Best Practices für den Umgang mit Ausnahmen“, so bin falsch, wenn Sie für einen Fehler überprüfen, die für diesen Zustand wahrscheinlich überprüfen auftritt, dann werden. Wenn Sie nach dbnull suchen können, tun Sie dies.

6

Verwenden Sie ‚Weiter Für‘

Nicht gut Praxis überall, aber nützlich in einigen Fällen, zum Beispiel finden Sie eine Datei beim Umgang mit dem Zugriff auf bestimmte Verzeichnisse verweigert:

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

Hier ist ein Beispiel in Code:

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

eine ganz alte Post, aber zum Wohl anderen. persönlich würde ich verwenden "auf Fehler fortsetzen nächsten" in diesem Fall ist es ein notwendiges Übel

+1

Kein professioneller Entwickler würde in irgendeiner Situation jemals 'bei Fehler fortsetzen' verwenden. Sobald Sie diesen ALL-Fehler verwenden, werden Sie einfach ignoriert ... Grob übersetzt bedeutet es, "Ich habe einen Fehler und es ist mir egal" .... – Monty

Verwandte Themen