|
Programación: El control de errores en Visual Basic .Net
Os explicamos cómo funciona el manejo de errores o excepciones en Visual Basci .Net, lenguaje de programación visual de Microsoft perteneciente a Visual Studio .Net. Os explicamos con ejemplos cómo capturar los posibles errores que se puedan producir en la ejecución normal del código para mostrar mensajes al usuario (o para que el usuario no se entere del error).
Manejo de errores en versiones anteriores de Visual BasicEn versiones anteriores de Visual Basic, como la versión 6, el control de errores se realizaba mediante: On Error GoTo cError .... :cSalir exit sub :cError msgbox "Número de error: " + err.number + vbcrlf + _ " Descripción del error: " + err.description o bien utilizando "On Error Resume Next". Visual Basic .Net sigue permitiendo el uso de estas dos intrucciones para el control de errores, pero Microsoft recomienda encarecidamente que no se utilicen y se empleen las nuevas intrucciones Try...Catch...Finally. El objeto Exception en Visual Basic .NETEl objeto Exception se encuentra definido en .NET Framework y su nombre completo es System.Exception. En este marco de trabajo se definen otras dos clases genéricas: System.SystemException y System.ApplicationException. Casi todos los objetos de Exception definidos en .NET Framework heredan de SystemException, mientras que los objetos de excepción personalizados y específicos de cada aplicación heredan de ApplicationException. Estas dos clases no agregan ninguna propiedad o método a la clase base Exception. A continuación enumaramos algunas de las clases Exception en los espacios de nombres más importantes de .NET Framework:
La instrucción Try...Catch...End Try ó Finally en Visual Basic .NETLa palabra clave CatchSiempre que se añada código fuente que pueda iniciar una excepción será conveniente introducirlo en un bloque Try...Catch...End. El código que quede entre Try y Catch estará protegido contra excepciones y si se iniciara una exceción, Visual Basic pasaría el control al primer bloque Catch (filtro de excepciones). En el bloque de código Catch se podrán examinar las propiedades del objeto Exception y decidir cómo reaccionar al error. Un ejemplo sencillo de control de excepciones: Private Sub btExcepcion_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btExcepcion.Click Dim x, y As Integer Try y = CInt(InputBox("Introduzca Y", "Control de excepciones", 0)) x = x y 'Si "y" = 0, la siguiente instrucción no se ejecutará y = CInt(10 ^ x) MsgBox("El valor de Y es: " + CStr(y)) Catch ex As Exception If ex.Message = "Intento de dividir por cero." Then MsgBox("Error al intentar dividir por cero.", _ MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) Else MsgBox("Se ha producido el siguiente error: " + ex.Message, _ MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) End If End Try End Sub En el ejemplo anterior se pide con un InputBox el valor de "y", se pueden dar varios casos según el valor introducido:
La forma anterior no es la adecuada para tratar las excepciones, pues se está comprobando el contenido de la cadena Message, que contiene la descripción del mensaje de error que se haya producido. La forma adecuada es que existan varios bloques Catch, cada uno de los cuales comprobará un objeto Exception distinto, según el código que introduzcamos entre el Try y los Catch. Por ejemplo: Private Sub btExcepcion_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles btExcepcion.Click Dim x, y As Integer Try y = CInt(InputBox("Introduzca Y", "Control de excepciones", 0)) x = x y 'Si "y" = 0, la siguiente instrucción no se ejecutará y = CInt(10 ^ x) MsgBox("El valor de Y es: " + CStr(y)) Catch ex As DivideByZeroException MsgBox("Error al intentar dividir por cero.", _ MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) Catch ex As OverflowException MsgBox("Error de desbordamiento, número muy grande.", _ MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) Catch ex As Exception MsgBox("Se ha producido el siguiente error: " + ex.Message, _ MsgBoxStyle.Critical + MsgBoxStyle.OkOnly) End Try End Sub En el ejemplo anterior los posibles errores (excepciones) están correctamente capturados. Se pueden dar varios casos:
Visual Basic comparará el tipo de objeto Exception que se haya iniciado con las expresiones contenidas en las cláusulas Catch en el orden en el que aparecen y ejecutará la primera que coincida. Es importante contar siempre con una expresión Catch final que coincida con el objeto System.Exception, como mostramos en el ejemplo anterior, porque este código siempre se ejecutará en el caso de que ninguna de las expresiones Catch anteriores coincidan con la excepción producida. Una cláusula Catch del objeto System.Exception siempre coincidirá con cualquier excepción porque todos los objetos Exception heredan de System.Exception. Como todas las expresiones Catch se evalúan en el orden en que aparecen, es recomendable comprobar las excepciones más específicas en primer lugar, en el ejemplo en primer lugar hemos colocado DivideByZeroException. Como hemos dicho, la comprobación del objeto System.Exception deberá estar en el último bloque Catch porque coincidirá con cualquier excepcion. Por ello, ningún bloque Catch situado detrás de de esta comprobación se ejecutará jamás. Además, cuando se ordenen los bloques Catch, se deberá tener en cuenta la jerarquía de excepciones y comprobar que nunca va a intentar capturar un objeto Exception después de capturar a su excepción padre. Por ejemplo, el bloque Catch correspondiente al objeto DivideByZeroException nunca deberá encontrarse a continuación del objeto ArithmeticException que resulta menos específico. Siempre se podrá salir de la estructura Try...End Try con la instrucción Exit Try, que puede insertarse dentro de un bloque Try o en cualquier bloque Catch. La palabra clave WhenDentro de la cláusula Catch se podrá utilizar una expresión When opcional que le permitirá especificar una condición adicional que el bloque Catch deberá evaluar como True para que sea seleccionada. Esta característica permitirá definir filtros de excepciones más específicos. Por ejemplo: --- La palabra clave FinallyEn determinadas ocasiones es necesario ejecutar un código de limpieza cuando se produce una excepción. Por ejemplo para cerrar un fichero abierto en el caso en que se produzca un error, o para cerrar la conexión con una base de datos. En estos casos en los que queremos ejecutar ---
Artículos relacionados
CréditosArtículo realizado íntegramente por Alonsojpd miembro fundador del proyecto AjpdSoft. Anuncios
Enviado el Viernes, 06 noviembre a las 00:46:53 por ajpdsoft
|
|