2010-06-08 10 views
13

Entiendo que en el siguiente ejemplo se debe usar una instrucción de resumen en lugar de una instrucción Goto.Diferencia entre Resume y Goto en el bloque de manejo de errores

Sub Method() 
    On Error Goto ErrorHandler 
    ... 
CleanUp: 
    ... 
    Exit Function 

ErrorHandler: 
    Log error etc 

    Err.Clear 'Is this line actually necessary?' 

    Resume CleanUp 'SHOULD USE THIS' 
    Goto CleanUp 'SHOULD NOT USE THIS' 
End Sub 

Mi pregunta es ¿qué diferencia hay en la ejecución de los dos?

Respuesta

21

Ambos transfieren la ejecución a la etiqueta Cleanup. Por lo que puedo recordar, las únicas diferencias son

  • Usando Goto no borra el objeto Err (por lo Err.Clear es necesaria si se utiliza Goto) y que salga de su gestor de errores desactivado. Si ocurre un error después de la etiqueta Cleanup, no se manejará en ErrorHandler.
  • Al usar Resume se borra el objeto Err y se vuelve a activar el controlador de errores (está deshabilitado mientras se manejan los errores). Si se produce un error después de la Cleanup lable, que será procesada en ErroHandler

El VB6 manual entry for the Resume statement no explica estas diferencias.

+0

Saludos, MarkJ, aprende muchas cosas de esta respuesta. –

+1

Durante las pruebas, he encontrado que si se produce un error en CleanUp, existirá un bucle infinte entre los bloques ErrorHandler y CleanUp. ¿Es la técnica recomendada, por lo tanto, para tener el currículum en error siguiente en la limpieza? –

+0

@Rich Oliver Sí, eso es lo que hago. Consulte esta pregunta http://stackoverflow.com/questions/536379/how-do-you-handle-errors-in-error-handlers-in-vb6 o incluso eche un vistazo a las otras preguntas etiquetadas 'vb6' y' manejo de errores' http://stackoverflow.com/questions/tagged?tagnames=vb6%2berror-handling&sort=votes&pagesize=15 – MarkJ

2

Esto es GRAN malentendido! No es importante diferencia entre:

Err.Clear 
GoTo CleanUp 

y:

Resume CleanUp 

NUNCA utilice la primera forma, utilizar SIEMPRE CleanUp Resume (solamente). Reanudar el RESET del estado de error de VB6 interno, por lo que cuando se produzca OTROS errores, se aplicará "En caso de error Ir a etiqueta". Si utiliza "Err.Clear", el objeto Err se borra, pero el estado de error INTERNO NO se borra y cuando se produce otro error, se considera como código SIN ningún controlador de excepción y se arroja fuera de la función. No se puede arreglar mediante el uso de "On Error GoTo Label2"

consideran este código: "! ERROR"

Public Sub Test() 
On Error GoTo L1 
MsgBox 0/(1 - 1) 
Exit Sub 

L1: 
    Err.Clear 
L0: 
    On Error GoTo L2 
    MsgBox 0/(1 - 1) 'ERROR! 
    Exit Sub 

L2: 
    MsgBox Err 
End Sub 

Si ejecuta este, se interrumpirá el línea. Si reemplaza "Err.Clear" con "Reanudar L0", la ejecución no se interrumpe en "ERROR". la línea y el código saltan a la etiqueta "L2" y proporcionan "MsgBox Err"

Cuestiones relacionadas