Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Cómo detectar errores en Visual Basic

  • 0 Respuestas
  • 2710 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Conectado ANTRAX

  • *
  • Administrator
  • Mensajes: 5487
  • Actividad:
    23.33%
  • Reputación 35
  • ANTRAX
    • Ver Perfil
    • Underc0de
    • Email
  • Skype: underc0de.org
  • Twitter: @Underc0de
« en: Julio 26, 2010, 11:40:10 am »
Cuando quieras que el Visual Basic "ignore" los errores que se produzcan en tu aplicación o en parte de ella, usa:

On Error Resume Next

Esto hará que si se produce un error, se continúe ejecutando el código como si nada hubiese ocurrido.
Por supuesto que la recomendación es que compruebes si se ha producido un error, ya que no es bueno dejar que los errores ocurran sin más.
Para ello tendrás que chequear el valor de la propiedad Number del objeto Err, (que al ser la propiedad por defecto no es necesario especificarla), si ese valor es cero quiere decir que no se ha producido un error; veamos un ejemplo:

Código: Visual Basic
  1. On

Código: Visual Basic
  1. Local Error Resume Next
  2.  
  3.     ' Error 13 producirá un error de tipos (Type Mismatch)
  4.    Error 13
  5.  
  6. If Err.Number Then
  7.     MsgBox "Se ha producido el siguiente error:" & vbCrLf & _
  8.             Err.Number & ", " & Err.Description
  9. End If
  10.  

Pero si haces esto, procura hacer un poco de limpieza... ya que, si desde este procedimiento llamas a otros procedimientos que a su vez tienen la instrucción On Error Resume Next  y no has "limpiado" el valor del número del error... cualquier comprobación que hagas de ese valor dará como resultado que se muestre el mensaje.
Veamos un par de ejemplos:
Para crear el programa de pueba, crea un nuevo proyecto, añade tresd botones (Command1, Command2 y Command3), y pega este código:

Código: Visual Basic
  1. Private Sub Command1_Click()

Código: Visual Basic
  1.  
  2.     ' Ejemplo para detectar errores en Visual Basic
  3.    Dim i As Integer
  4.    
  5.     On Local Error Resume Next
  6.    
  7.     i = MsgBox("Pulsa SI para producir un error en este evento," & vbCrLf & _
  8.                 "pulsa en NO para llamar al procedimiento Command2_Click" & vbCrLf & _
  9.                 "pulsa en Cancelar para llamar al procedimiento Command3_Click", vbYesNoCancel)
  10.    
  11.     If i = vbYes Then
  12.         ' Error 13 producirá un error de tipos (Type Mismatch)
  13.        Error 13
  14.     ElseIf i = vbNo Then
  15.         ' El error producido en el procedimiento Command2 está controlado,
  16.        ' por tanto no se mostrará el mensaje del final
  17.        Command2_Click
  18.     Else
  19.         ' Esto producirá un error en Command3, pero se detectará aquí
  20.        Command3_Click
  21.     End If
  22.    
  23.     If Err Then
  24.         MsgBox "Se ha producido el siguiente error:" & vbCrLf & _
  25.                 Err.Number & ", " & Err.Description, , "En Command1_Click"
  26.     End If
  27.    
  28. End Sub
  29.  
  30.  
  31. Private Sub Command2_Click()
  32.     On Local Error Resume Next
  33.    
  34.     ' Error 76, (Path not found)
  35.    Error 76
  36.    
  37.     If Err Then
  38.         ' Este error está comprobado dentro de este procedimiento, por tanto no mostrará nada
  39.    End If
  40.    
  41.     ' Limpiamos el valor del error
  42.    Err = 0
  43. End Sub
  44.  
  45.  
  46. Private Sub Command3_Click()
  47.    
  48.     ' Este procedimiento produce un error número 5
  49.    Error 5
  50.    
  51.     ' Este mensaje NUNCA se mostrará
  52.    MsgBox "El valor de Err.Number es: " & Err.Number & vbCrLf & _
  53.            "Aquí no se notará que se ha producido un error..." & vbCrLf, , "En Command3_Click"
  54.    
  55. End Sub
  56.  
  57.  

Veamos que es lo que hace este código y porqué.

Cuando pulses en el Command1 te mostrará un mensaje pidiendote que selecciones el tipo de prueba que quieres hacer, para probar cada una de ellas, tendrás que pulsar varias veces en ese botón, una para cada una de las tres posibilidades.

Si pulsas en "SI", el error se producirá en este mismo evento y el mensaje del final nos indicará que se ha producido el error número 13.

Cuando pulses en "NO", se llamará al procedimiento Command2_Click en el que se produce un error 76, pero que el propio procedimiento se encarga de gestionar y "limpiar", por tanto, no ocurrirá, al menos aparentemente, nada.

Por último, al pulsar en "Cancelar", se llama al procedimiento Command3_Click, el cual produce el error 5, pero no detecta los errores; pero como el Visual Basic "sabe" que aún hay una rutina "interceptadora" de errores en funcionamiento, la del Command1, deja de ejecutar el código erróneo y vuelve a la siguiente instrucción que haya en el procedimiento Command1...

Después de estas tres pruebas, pulsa en el Command2. Nada ocurre, ya que el código detecta los posibles errores.

Cuando pulses en el Command3, verás que el Visual Basic se detiene mostrandonos una ventana de error, esto ocurre porque no hay ninguna rutina de detección de errores en funcionamiento y cuando no la hay... el Visual Basic nos muestra la suya propia y detiene el programa.

Ahora cambia el código del Command3_Click por este otro:

Código: Visual Basic
  1.  
  2. Private Sub Command3_Click()
  3.    
  4.     On Local Error Resume Next
  5.    
  6.     ' Este procedimiento produce un error número 5
  7.    Error 5
  8.    
  9.     ' Ahora si que se mostrará este mensaje
  10.    MsgBox "El valor de Err.Number es: " & Err.Number & vbCrLf & _
  11.            "Aquí no se notará que se ha producido un error..." & vbCrLf, , "En Command3_Click"
  12.    
  13. End Sub

Como verás, al no "limpiar" el valor de la propiedad Err.Number, el valor se mantiene; y a pesar de que se haya detectado el error en ese evento, al volver de nuevo al código del Command1, se mostrará el mensaje de que hay error... y además el mensaje que tenemos en el evento Command2_Click, el cual antes no se mostraba.



Resumiendo:

Si detectas los errores con Resume Next, acostumbrate a dejar el valor de Err.Number a cero antes de que acabe y/o antes de salir del procedimiento. Recuerda que para salir de un procedimiento puedes usar Exit Sub, Exit Function o Exit Property.

También debes saber que, cuando acaba un procedimiento, la rutina que gestiona los errores también acaba, pero, como has podido comprobar, el valor del error permanece asignado.
« Última modificación: Julio 08, 2011, 10:29:03 am por ANTRAX »


 

¿Te gustó el post? COMPARTILO!



Como leer caracter por caracter de una cadena string

Iniciado por ANTRAX

Respuestas: 0
Vistas: 2168
Último mensaje Julio 26, 2010, 11:42:21 am
por ANTRAX
Cómo ajustar la cadena introducida a formato numérico: "#,##"

Iniciado por ANTRAX

Respuestas: 0
Vistas: 1977
Último mensaje Julio 26, 2010, 12:38:04 pm
por ANTRAX
Cómo ajustar la cadena introducida a formato de hora "00:00:00"

Iniciado por ANTRAX

Respuestas: 0
Vistas: 2343
Último mensaje Julio 26, 2010, 12:36:23 pm
por ANTRAX
Llamada de un formulario mediante el nombre como string

Iniciado por ANTRAX

Respuestas: 0
Vistas: 2007
Último mensaje Julio 26, 2010, 04:08:58 pm
por ANTRAX
Como pasar de un texto a otro usando Enter

Iniciado por ANTRAX

Respuestas: 0
Vistas: 2307
Último mensaje Julio 26, 2010, 10:28:10 am
por ANTRAX