Leonel Morales Díaz Ingeniería Simple leonel@ingenieriasimple.com Manejo de Errores Leonel Morales Díaz Ingeniería Simple leonel@ingenieriasimple.com Copyright 2008 by Leonel Morales Díaz – Ingeniería Simple. Derechos reservados Disponible en: http://www.ingenieriasimple.com/introprogra
Errores de Léxico Uso de un símbolo no definido Uso de símbolos que no son del lenguaje Ejemplo: Dima UnStr UnStr -- “Guatemala” For i = * To 40j
Errores de Sintáxis Uso de símbolos en lugares inadecuados Omisión del símbolo correcto Ejemplo: If A < Then A = 38**B Else B = B*4>A If
Errores Semánticos Errores en el sentido de la construcción No tiene sentido Ejemplo: Dim A,B A = “Guatemala” B = A*8
Errores Lógicos El programa no corresponde con lo que se quiere hacer Produce resultados ilógicos Ejemplo: Construír una tabla de 2x2 en cada celda de una de 2x2
Errores Lógicos ej074.html Dim i,j Document.Write "<Table Border=1>" For i = 1 To 2 Document.Write "<TR>" For j = 1 To 2 Document.Write "<TD><Table Border=1>" Do While i < 2 Do While j < 2 Document.Write "<TD> </TD>" j = j + 1 Loop Document.Write "</TR>" i = i + 1 Document.Write "</Table></TD>" Next Document.Write "</Table>" ej074.html
Errores de Tiempo de Corrida Ocurren en condiciones específicas durante la ejecución No fueron previstos al programar Detienen la ejecución del programa Ejemplos: División entre cero Indices fuera de límites en vectores Uso no válido de nulo Cambio de formatos de fecha Abrir un archivo inexistente
El Objeto Err Almacena los datos del último error Es un objeto Tiene propiedades o atributos Tiene comportamiento (métodos) Propiedades: Number, Source, Description Métodos: Clear, Raise
¿De qué sirve el objeto Err? Si la ejecución se detuvo, ¿cómo se puede consultar la información del error?
Flujo en Caso de Errores Instrucción On Error Si hay un error: Si se usa On Error Resume Next Continúa en la siguiente instrucción Si se usa On Error Goto 0 El programa se detiene Se marca error Si nada se indica Se asume On Error Goto 0
¿Dónde Ocurre Error? Dim i,Arr1(8) Randomize For i = 0 To 8 Arr1(i) = Round(Rnd()*10,0) Next Arr1(i) = Arr1(i) / Arr1(i+1) Document.Write "<Table Border=1><TR>" For i = 0 To 9 Document.Write "<TD>" & Arr1(i) & "</TD>" Document.Write "</TR></Table>"
On Error Resume Next Dim i,Arr1(8) Randomize For i = 0 To 8 Arr1(i) = Round(Rnd()*10,0) Next On Error Resume Next Arr1(i) = Arr1(i) / Arr1(i+1) Document.Write "<Table Border=1><TR>" For i = 0 To 9 Document.Write "<TD>" & Arr1(i) & "</TD>" Document.Write "</TR></Table>" Dim i,Arr1(8) Randomize For i = 0 To 8 Arr1(i) = Round(Rnd()*10,0) Next On Error Resume Next Arr1(i) = Arr1(i) / Arr1(i+1) On Error Goto 0 Document.Write "<Table Border=1><TR>" For i = 0 To 9 Document.Write "<TD>" & Arr1(i) & "</TD>" Document.Write "</TR></Table>"
Políticas de Error No hacer nada A favor: En contra: Se atiende el error cuando ocurre A favor: Desarrollo más rápido Código más simple En contra: Hay que “parchar” el código Costos de soporte y mantenimiento
Políticas de Error Que ocurra “elegantemente” A favor: En contra: Mostrar mensaje explicativo del error Guardarlo en una bitácora A favor: Se maneja el error de forma sencilla y estandarizada En contra: Se obliga al usuario a interpretarlo Mucho código “de cajón”
Ocurre Elegantemente ej075.html Dim UnNum,Repetir Repetir = True Do While Repetir UnNum = InputBox("Ingrese un número","Ingreso",0) On Error Resume Next Document.Write "El número ingresado es: " & UnNum & _ " que dividido 8 da: " & (UnNum/8) If Err.Number > 0 Then MsgBox "Ha ocurrido el error:" & VBNewLine & Err.Number & _ VBNewLine & "de descripción:" & VBNewLine & Err.Description & _ VBNewLine & "de origen:" & VBNewLine & Err.Source,VBCritical,"Error" Err.Clear Else Repetir = False End If On Error Goto 0 Loop ej075.html
Políticas de Error Que ocurra sin que se note A favor: En contra: Suprimir los avisos de error Poner un On Error Resume Next al inicio A favor: Permite ejecutar los programas hasta el final En contra: Errores importantes nunca salen a la luz
Políticas de Error Cero tolerancia a errores Prevenir los errores, hacer que no ocurran Eliminar los errores antes de producción Si pueden ocurrir anticiparse Si no pueden anticiparse hacer que: Falle en seguro (fail safe) Degradación aceptable (fail soft) Tolerancia completa (fail operational)
Políticas de Error Cero tolerancia a errores A favor: En contra: Exige planificar la codificación Exige disciplina en la codificación Reduce costos de soporte y mantenimiento En contra: Difícil de implementar
Errores de Strings Verificar Cadena vacía No nulo Longitud cero No nulo Espacios al inicio y al final Espacios en el medio ej076.html ej077.html