2010-07-29 24 views
6

Me gustaría saber si hay una manera de dejar que el programa continúe después de que se lanza una excepción. Por ejemplo:Continuar Código después de la excepción

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 

Gracias.

Respuesta

10

Si estás haciendo algo que sabes cómo recuperarse de, o que no es vital, que se supone que envuelva sólo que la línea en el try/catch con una captura específica. p.

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 no es compatible con este tipo de constructo. Una vez que la excepción desenrolla la pila, no se puede volver a desenrollar. Algunos lenguajes le permiten reanudar la excepción, pero requieren una administración de pila más sofisticada, esencialmente corutinas.

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

¿Sintió la necesidad de tomar una ducha después de escribir eso? :) –

+0

aww ... me lo ganaste :) y si no tenías ganas de crear todos los bloques try-catch siempre existe la temida declaración goto. ¡Pero no lo sugeriría! –

+0

uff bien, parece que es la única manera de ir ... gracias – carlos

3

Aunque On Error Resume Next es still available in VB.NET, es mutuamente excluyentes para el método preferido de control estructurado de excepciones.

En su lugar, yo recomendaría el uso de la cláusula de Finally de un bloque Try..Catch..Finally para asegurar Line 5 and Line 6 se ejecutan incluso si la línea 4 (o cualquier línea anterior) lanza.

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

En este caso, la excepción es una conversión de dbnull a int después de leer desde un dB ... pero esto fue solo un dato de muchos otros, y es por eso que quería seguir leyendo ... ¡¡Gracias !! por los comentarios! – carlos

0

Si no me equivoco las "mejores prácticas para manejo de excepciones" dice si se puede comprobar si hay un error que probablemente va a ocurrir a continuación, comprobar para esa condición. Si puede verificar si hay dbnull, hágalo.

6

Uso 'Continuar Para'

No es una buena práctica en todas partes, pero útil en algunas circunstancias, por ejemplo, encontrar un archivo, mientras que la manipulación niega el acceso a ciertos directorios:

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

Aquí se muestra un ejemplo de código:

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

bastante una entrada antigua, pero por el bien de los demás. Personalmente, utilizaría "en error reanudar siguiente" en este caso es un mal necesario

+1

Ningún desarrollador profesional usaría 'en error reanudar próximo' en cualquier situación. Una vez que usas este TODO error simplemente se ignoran ..... Aproximadamente traducido significa, 'Tengo un error y no me importa' ... – Monty

Cuestiones relacionadas