manual de vb.net en nuestro idioma parte 7

Ver el tema anterior Ver el tema siguiente Ir abajo

manual de vb.net en nuestro idioma parte 7

Mensaje  HERNAN DARIO RODRIGUEZ el Mar 17 Ago - 10:10:54

Excepciones


Lo siguiente fue extraído de la ayuda, que otra mejor explicación que esa.

Visual Basic admite un control de excepciones (errores) tanto estructurado como no estructurado.
El control de errores estructurado y no estructurado permite establecer un plan para detectar posibles errores, y así impedir que éstos interfieran en los supuestos objetivos de la aplicación.
Si se produce una excepción en un método que no esté preparado para controlarla, la excepción se propagará de vuelta al método de llamada o al método anterior. Si el método anterior tampoco tiene controlador de excepciones, la excepción se propagará de vuelta al llamador del método, y así sucesivamente. La búsqueda de un controlador continuará hasta la pila de llamadas, que es la serie de procedimientos a los que se llama dentro de la aplicación. Si ésta tampoco encuentra un controlador para la excepción, se mostrará un mensaje de error y la aplicación finalizará.

Nota Un método puede contener un método de control de excepciones estructurado o uno no estructurado, pero no ambos.
Control estructurado de excepciones
En el control estructurado de excepciones, los bloques de código se encapsulan y cada uno de ellos tiene uno o varios controladores asociados. Cada controlador especifica una forma de condición de filtro para el tipo de excepción que controla. Cuando el código de un bloque protegido genera una excepción, se busca por orden en el conjunto de controladores correspondientes y se ejecuta el primero que contenga una condición de filtro coincidente. Un método puede tener varios bloques de control estructurado de excepciones y dichos bloques pueden además estar anidados.
La instrucción Try...Catch...Finally se utiliza específicamente para el control estructurado de excepciones.
Aquí en este manualillo solo se explicará este método, el control estructurado de excepciones.
Visual Basic admite el control estructurado de excepciones, que facilita la tarea de crear y mantener programas mediante controladores de errores consistentes y exhaustivos. El control estructurado de excepciones es un código diseñado para detectar y dar respuesta a los errores que se producen durante la ejecución, mediante la combinación de una estructura de control (similar a Select Case o While) con excepciones, bloques de código protegidos y filtros.

El uso de la instrucción Try…Catch…Finally permite proteger bloques de código con posibilidades de generar errores. Los controladores de excepciones pueden anidarse, y las variables que se declaren en cada bloque tendrán un ámbito local.


Try
‘El código que puede producir el error
Catch [filtros opcionales o tipos de errores a capturar]
‘Código para cuando se produzca un error
[bloques catch adicionales]
Finally
‘Código para cuando aparezca o no un error
End Try

El bloque Try de un controlador de excepción Try...Catch...Finally contiene la sección del código que el controlador de errores va a supervisar. Si se produce un error durante la ejecución de cualquier parte del código de esta sección, Visual Basic examinará cada instrucción Catch de Try...Catch...Finally hasta que encuentre una cuya condición coincida con el error. Si la encuentra, el control se transferirá a la primera línea de código del bloque Catch. Si no se encuentra una instrucción Catch coincidente, la búsqueda continuará en las instrucciones Catch del bloque Try...Catch...Finally exterior que contiene el bloque en el que ocurrió la excepción. Este proceso se prolongará a lo largo de toda la pila hasta que se encuentre un bloque Catch coincidente en el procedimiento actual. De no encontrarse, se produciría un error.
El código de la sección Finally siempre se ejecuta en último lugar, inmediatamente antes que el bloque de control de errores pierda su ámbito, con independencia de que se ejecute el código de los bloques Catch. Sitúe el código de limpieza (el código que cierra los archivos y libera los objetos, por ejemplo) en la sección Finally.

Filtrar errores en el bloque Catch
Los bloques Catch ofrecen tres opciones para filtrar errores específicos. En una de ellas, los errores se filtran basándose en la clase de la excepción (en este caso ClassLoadException), como se muestra en el siguiente código:
Try
' "Try" block.
Catch e as ClassLoadException
' "Catch" block.
Finally
' "Finally" block.
End Try
Si se produce un error ClassLoadException, se ejecuta el código del bloque Catch especificado.
En la segunda opción para filtrar errores, la sección Catch puede filtrar cualquier expresión condicional. Un uso común de este formato del filtro Catch consiste en comprobar números de error específicos, como se muestra en el código siguiente:
Try
' "Try" block.
Catch When ErrNum = 5 'Type mismatch.
' "Catch" block.
Finally
' "Finally" block.
End Try

Cuando Visual Basic encuentra el controlador de errores coincidente, ejecuta el código de este controlador y pasa el control al bloque Finally.

Nota Al buscar un bloque Catch que controle una excepción, se evalúa el controlador de cada bloque hasta encontrar uno que coincida. Puesto que estos controladores pueden ser llamadas a funciones, es posible que se produzcan efectos secundarios no esperados; por ejemplo, una llamada de este tipo puede cambiar una variable pública y provocar que ésta se utilice en el código de un bloque Catch distinto que termina controlando la excepción.
La tercera alternativa, consiste en combinar las primeras dos opciones y utilizar ambas para el control de excepciones.
El bloque Finally siempre se ejecuta, con independencia de cualquier otra acción que tenga lugar en los bloques Catch anteriores. No puede utilizar Resume o Resume Next en el control estructurado de excepciones.

Ahora se realizarán una serie de ejemplos que aclararán lo expuesto

Ejemplo 1.

Module Module1

Sub Main()
Dim sValor As String
Dim iNumero As Integer
Try
'Aqui comienza el control de errores
Console.WriteLine("Introducir un número")
sValor = Console.ReadLine
'Si no hemos introducido ningún número
iNumero = sValor 'aquí se producira un error

Catch
'Si se produce un error, se generará una excepción
'que capturamos en este bloque de código
'manipulador de excepción, definido por Catch
Console.WriteLine("Error al introducir el número" & ControlChars.CrLf & "el valor {0} es incorrecto", sValor)
End Try
Console.Read()
End Sub

End Module

Esta y las siguientes 2 líneas no pertenecen al código anterior
Observen que antes de module1 no están declaradas Option Explicit On o
Option Strict On.


Ejemplo 2. El clásico de la división por cero el que está en todos los libros

Module Module1

Sub Main()
Dim x As Integer = 5
Dim y As Integer = 0
Try
x /= y
Catch ex As Exception When y = 0
Console.WriteLine(ex.Message)
Finally
Console.WriteLine("Este código siempre se ejecuta")
End Try
Console.Read()
End Sub

End Module

Esta y las siguientes 2 líneas no pertenecen al código anterior
Observen que antes de module1 no están declaradas Option Explicit On o
Option Strict On.

Otra forma de generar la anterior excepción es:

Ejemplo 3

Module Module1

Sub Main()
Dim x As Integer = 0
Try
Dim y As Integer = 100 / x
Catch e As ArithmeticException
Console.WriteLine("ArithmeticException Handler: {0}", e.ToString())
Catch e As Exception
Console.WriteLine("Generic Exception Handler: {0}", e.ToString())
End Try
Console.Read()
End Sub

End Module

Ejemplo 4

El siguiente ejemplo es el mismo del ejemplo 1 pero se le adicionó al final más código

Module Module1

Sub Main()
Dim sValor As String
Dim iNumero As Integer
Try
'Aqui comienza el control de errores
Console.WriteLine("Introducir un número")
sValor = Console.ReadLine
'Si no hemos introducido ningún número
iNumero = sValor 'aquí se producira un error

Catch
'Si se produce un error, se generará una excepción
'que capturamos en este bloque de código
'manipulador de excepción, definido por Catch
Console.WriteLine("Error al introducir el número" & ControlChars.CrLf & "el valor {0} es incorrecto", sValor)

End Try
Dim dtFecha As Date
Console.WriteLine("Introducir una fecha")
'Si ahora se produce un error,
'al no disponer de una estructura para controlarlo
'se cancelará la ejecución
dtFecha = Console.ReadLine
Console.WriteLine("La fecha es {0}", dtFecha)
Console.ReadLine()
End Sub

End Module

Se debe tener en cuenta la forma de capturar los errores desde los más específicos hasta los más generales de lo contrario los errores serán tomados dentro del primer catch no permitiendo capturar el error específico que necesitamos. Por ejemplo en el ejercicio anterior el catch es muy general esto quiere decir que cualquier error que se produzca entrará a este bloque.

Ahora les mostrare el listado que tiene la ayuda sobre las excepciones especificas y que cada una tiene a su vez otras más específicas.

System.AppDomainUnloadedException
System.ArgumentException
System.ArithmeticException
System.ArrayTypeMismatchException
System.BadImageFormatException
System.CannotUnloadAppDomainException
System.ComponentModel.Design.Serialization.CodeDomSerializerException
System.ComponentModel.LicenseException
System.ComponentModel.WarningException
System.Configuration.ConfigurationException
System.Configuration.Install.InstallException
System.ContextMarshalException
System.Data.DataException
System.Data.DBConcurrencyException
System.Data.SqlClient.SqlException
System.Data.SqlTypes.SqlTypeException
System.Drawing.Printing.InvalidPrinterException
System.EnterpriseServices.RegistrationException
System.EnterpriseServices.ServicedComponentException
System.ExecutionEngineException
System.FormatException
System.IndexOutOfRangeException
System.InvalidCastException
System.InvalidOperationException
System.InvalidProgramException
System.IO.InternalBufferOverflowException
System.IO.IOException
System.Management.ManagementException
System.MemberAccessException
System.MulticastNotSupportedException
System.NotImplementedException
System.NotSupportedException
System.NullReferenceException
System.OutOfMemoryException
System.RankException
System.Reflection.AmbiguousMatchException
System.Reflection.ReflectionTypeLoadException
System.Resources.MissingManifestResourceException
System.Runtime.InteropServices.ExternalException
System.Runtime.InteropServices.InvalidComObjectException
System.Runtime.InteropServices.InvalidOleVariantTypeException
System.Runtime.InteropServices.MarshalDirectiveException
System.Runtime.InteropServices.SafeArrayRankMismatchException
System.Runtime.InteropServices.SafeArrayTypeMismatchException
System.Runtime.Remoting.RemotingException
System.Runtime.Remoting.ServerException
System.Runtime.Serialization.SerializationException
System.Security.Cryptography.CryptographicException
System.Security.Policy.PolicyException
System.Security.SecurityException
System.Security.VerificationException
System.Security.XmlSyntaxException
System.ServiceProcess.TimeoutException
System.StackOverflowException
System.Threading.SynchronizationLockException
System.Threading.ThreadAbortException
System.Threading.ThreadInterruptedException
System.Threading.ThreadStateException
System.TypeInitializationException
System.TypeLoadException
System.TypeUnloadedException
System.UnauthorizedAccessException
System.Web.Services.Protocols.SoapException
System.Xml.Schema.XmlSchemaException
System.Xml.XmlException
System.Xml.XPath.XPathException
System.Xml.Xsl.XsltException

Podemos la lista de excepciones que se derivan por ejemplo de System.ArithmeticException que son:

System.DivideByZeroException
System.NotFiniteNumberException
System.OverflowException

Ustedes tendrán que averiguar que hace cada una dependiendo de lo que se esté trabajando, por ejemplo si están trabajando matrices y vectores existirán excepciones específicas para el tratamiento de vectores y matrices, ahora si están trabajando archivos también tendrá excepciones específicas para ser tratadas.
Otro ejemplo

try
{
FileStream f = new FileStream(filename, FileMode.Create);
StreamWriter s = new StreamWriter(f);

s.WriteLine("{0} {1}", "test", 55);
s.Close();
f.Close();
}
catch (IOException e)
{
Console.WriteLine("Error abriendo el archivo {0}", filename);
Console.WriteLine(e);
}


La excepción de este último ejemplo es general, ahora si se quiere ser más específico se deben usar una de las siguientes excepciones que se derivan de la clase IOException.

System.IO.IOException
System.IO.DirectoryNotFoundException
System.IO.EndOfStreamException
System.IO.FileLoadException
System.IO.FileNotFoundException
System.IO.PathTooLongException

Por último el siguiente ejemplo


Option Explicit
Option Strict
Imports System
Module Module1

Sub Main()
Dim x(2) As Integer
Try
x(3) = 5 'Si asignamos en un índice que no existe
'entonces se produce la siguiente excepción
Catch e As IndexOutOfRangeException
Console.WriteLine("IndexOutOfRangeException Handler: {0}", e.Message)
Catch e As Exception
'Por si sucede otro tipo error
Console.WriteLine("Exception genérica: {0}", e.Message)
End Try
Console.Read()
End Sub

End Module


Bueno no se si he sido claro igual este tema no es del todo masticable como lo dicho depende del caso presentado. Sin embargo antes de pasar al modo gráfico o Windows Form se dedicara una entrega a repasar con nuevos ejemplos un poco más completos de cada tema para que les quede más claro todo lo que se ha visto, por decir algo se realizarán ejemplos con vectores, matrices, archivos, cadenas, procedimientos, funciones etc.
Muchos se preguntarán porque sólo he tratado hasta ahora en modo consola y no he ingresado a los formularios, simple, muchas personas aún no tienen el visual studio.net entonces solo cuentan con la plataforma el .Net Framework, por esto se continuará el modo consola incluso cuando veamos clases y alguna parte de ADO.net digamos que al menos la conexión y algunas operaciones básicas con las bases de datos.
La siguiente entrega será sobre archivos
avatar
HERNAN DARIO RODRIGUEZ

Mensajes : 14
Puntos : 45
Fecha de inscripción : 04/08/2010
Edad : 35
Localización : cali

Ver perfil de usuario

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.