2008-12-10 25 views
16

Esto es más una observación que una pregunta real: MS-Access (y VBA en general) está perdiendo una herramienta donde el código de manejo de errores puede generarse automáticamente, y donde el número de línea puede se mostrará cuando se produzca un error. ¿Encontraste una solución? ¿Qué es? Me di cuenta de cuántos cientos de horas perdoné desde que encontré la respuesta correcta a este problema básico hace unos años, y me gustaría ver cuáles son sus ideas y soluciones sobre este tema tan importante.MS-Access, VBA y manejo de errores

Respuesta

5

Mi solución es la siguiente:

  1. instala MZ-Tools, un complemento muy interesante para VBA. No, no me pagaron, de todos modos es gratis.
  2. programa un código de gestor de errores estándar, tal como este (ver MZ menú Herramientas/Opciones/manejador de errores):

On Error GoTo {PROCEDURE_NAME}_Error 
{PROCEDURE_BODY} 
On Error GoTo 0 
Exit {PROCEDURE_TYPE} 

{PROCEDURE_NAME}_Error: 
debug.print "#" & Err.Number, Err.description, "l#" & erl, "{PROCEDURE_NAME}", "{MODULE_NAME}" 

Este código de error estándar puede ser entonces agrega automáticamente a todos sus procesos y funciones haciendo clic en el botón correspondiente en el menú MZ-Tools. Notarás que nos referimos aquí a un valor/propiedad indocumentado de VBA (edición de 2003), 'erl', que significa 'línea de error'. ¡Lo tienes! Si le pides a MZ-Tools que numere automáticamente tus líneas de código, 'erl' te dará el número de la línea donde ocurrió el error. Tendrá una descripción completa del error en la ventana inmediata, tales como:

#91, Object variable or With block variable not set, l# 30, addNewField, Utilities 

Por supuesto, una vez que se da cuenta del interés del sistema, se puede pensar en un gestor de errores más sofisticado, que no sólo mostrar los datos en la ventana de depuración, pero lo hará también:

  1. pantalla como un mensaje en la pantalla
  2. automáticamente insertar una línea en un archivo de registro de errores con la descripción del error o
  3. si está trabajando con Access o si está conectado a una base de datos, ¡agregue automáticamente un registro a una tabla Tbl_Error!

lo que significa que cada error generado en el nivel de usuario se puede almacenar en un archivo o una tabla, en algún lugar de la máquina o de la red. ¿Estamos hablando de creando un sistema automático de informe de errores trabajando con VBA?

+2

Una buena publicación, pero soy crítico con la práctica de que el controlador de errores y la rutina de salida no tengan un nombre uniforme, por ejemplo, errHandler y exitRoutine. Debido al alcance de la etiqueta, no hay razón para hacerlos específicos para el sub particular. Hace que cortar y pegar sea muchísimo más fácil. –

+0

Tiene razón: no es necesario que tenga un nombre específico para la rutina de error. Pero realmente no importa ya que no hará copias/pases de 1 proc a otro, sino que más bien usará el botón "Insertar código de error", que genera las líneas necesarias de acuerdo con el formato predefinido. –

+2

En caso de error Goto 0 es una línea innecesaria, ya que está saliendo del procedimiento en la línea siguiente. la instrucción On Error Goto ErrorHandler no se aplica fuera del procedimiento – Nick

5

Bueno, hay un par de herramientas que harán que lo que pida MZ Tools y FMS Inc me vienen a la mente.

Básicamente consisten en la adición de un:

On Error GoTo ErrorHandler 

a la parte superior de cada proc y al final que poner:

ErrorHandler: 
    Call MyErrorhandler Err.Number, Err.Description, Err.LineNumber 

etiqueta con por lo general una llamada a un controlador de errores global donde puede visualizar y registrar mensajes de error personalizados

+0

¡Sacaste las palabras de mi boca! –

+4

Esto es un poco engañoso ya que Err.LineNumber no existe. Por lo tanto, si bien es una buena práctica para el manejo genérico de errores, no responde al problema principal de la numeración de líneas. Si necesita hacer esto, entonces la respuesta con Erl sería mejor si * tuviera * un número de línea. – FinancialRadDeveloper

7

¿Qué pasa con el uso de "Erl", se mostrará la última etiqueta antes del error (por ejemplo, 10, 20 o 30)?

Private Sub mySUB() 
On Error GoTo Err_mySUB 
10: 
    Dim stDocName As String 
    Dim stLinkCriteria As String 
20: 
    stDocName = "MyDoc" 
30: 
    DoCmd.openform stDocName, acFormDS, , stLinkCriteria  
Exit_mySUB: 
    Exit Sub 
Err_mySUB: 
    MsgBox Err.Number & ": " & Err.Description & " (" & Erl & ")" 
    Resume Exit_mySUB 
End Sub 
2

Siempre se puede rodar su propia herramienta como Chip Pearson lo hicieron. VBA puede acceder a su propio IDE a través del Microsoft Visual Basic for Applications Extensibility 5.3 Library. He escrito algunos módulos de clase que hacen que sea más fácil trabajar conmigo mismo. Se pueden encontrar en Code Review SE.

Lo uso para insertar declaraciones On Error GoTo ErrHandler y las etiquetas y constantes apropiadas relacionadas con mi esquema de manejo de errores. También lo uso para sincronizar las constantes con los nombres de los procedimientos reales (si los nombres de las funciones cambian).