2010-07-29 23 views
6

Chciałbym wiedzieć, czy istnieje sposób, aby pozwolić programowi kontynuować po zgłoszeniu wyjątku. Na przykład:Kontynuuj kod po wyjątku

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 

Dzięki.

Odpowiedz

10

Jeśli robisz coś, co wiesz jak odzyskać lub że nie jest istotne, to powinniśmy owinąć tylko ten wiersz w try/catch z konkretnym połowu. np.

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 nie obsługuje tego typu konstrukcji. Gdy wyjątek rozwinie stos, nie będzie można go cofnąć. Niektóre języki pozwalają na wznowienie wyjątku, ale wymagają bardziej zaawansowanego zarządzania stosami - w zasadzie coroutines.

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

Czy odczuwasz potrzebę wzięcia prysznica po wpisaniu tego? :) –

+0

aww ... mnie biłeś :) Jeśli nie masz ochoty na tworzenie wszystkich bloków try-catch, zawsze znajdziesz przerażające zdanie goto. Ale nie sugerowałbym tego! –

+0

Uff również wydaje się, że jest to jedyny sposób, aby przejść .. dzięki – carlos

3

Chociaż On Error Resume Nextstill available in VB.NET to, że wyklucza się do preferowanego sposobu strukturalnej obsługi wyjątków.

Zamiast tego, polecam użycie klauzuli Finally bloku Try..Catch..Finally, aby zapewnić wykonanie Line 5 and Line 6, nawet jeśli rzuci Linia 4 (lub jakakolwiek poprzednia Linia).

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

W tym przypadku wyjątek jest spowodowany przez dbnullconversion do int po przeczytaniu z dB ... ale to był tylko jeden z wielu innych danych, i dlatego chciałem dalej czytać .. Dzięki! za komentarze! – carlos

0

Gdybym nie mylę „Dobrych Praktyk dla Obsługa wyjątków” mówi, że jeśli można sprawdzić za błąd, który będzie prawdopodobnie wystąpią następnie sprawdzenia tego warunku. Jeśli możesz sprawdzić dla dbnull, zrób to.

6

Wykorzystanie „Kontynuuj Dla”

Nie dobra praktyka wszędzie, ale przydatne w pewnych okolicznościach, na przykład znaleźć plik podczas obsługi odmówiono dostępu do niektórych katalogów:

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

Oto przykład w postaci kodu:

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

dość starego posta ale dla dobra innych. osobiście użyłbym "przy błędzie wznowienia dalej" w tym przypadku jest to konieczne zło

+1

Żaden profesjonalny programista nie użyłby opcji "w razie potrzeby wznowić błąd" w dowolnej sytuacji. Po użyciu tego błędu ALL są po prostu ignorowane ..... Z grubsza przetłumaczone oznacza to, "Mam błąd i mnie to nie obchodzi" .... – Monty

Powiązane problemy