Buscador

La influencia del orden de los manipuladores de excepciones

El orden en el que situemos las sentencias Catch dentro de una estructura Try...End Try, es determinante, a la hora de que ciertas excepciones puedan ser capturadas. Por este motivo, al escribir un controlador de errores, se recomienda situar en primer lugar, los manipuladores más específicos, y dejar para el final, los más genéricos. 
En el ejemplo que muestra el Código fuente 360 se pueden producir dos tipos de excepción: por desbordamiento, y por acceso a índice no existente en un array. El problema que tenemos en dicha construcción de código, reside en que el manipulador de excepciones de desbordamiento nunca se ejecutará, ya que en primer lugar hemos situado uno más genérico que captura todo tipo de excepciones, incluidas las que se produzcan por desbordamiento.

Public Sub Main()
Dim byMiNum As Byte
Dim aValores() As String = {"a", "b", "c"}
Try
' comienza el control de errores
Console.WriteLine("Introducir un número")
' si no es un número Byte se produce error
byMiNum = Console.ReadLine()
' esta línea produce error siempre, ya
' que no existe el índice 5 en el array
aValores(5) = "d"
Catch oExcep As Exception
' manipulador genérico de excepciones,
' captura todo tipo de excepciones, por lo que si
' también se produce una excepción OverflowException,
' se ejecutará este manipulador, por estar situado primero
Console.WriteLine("Se ha producido un error")
Catch oExcep As OverflowException
' captura de errores de desbordamiento,
' este manipulador nunca se ejecutará, por estar
' uno más genérico antes
Console.WriteLine("El número introducido " & _
"no se encuentra en el rango adecuado")
Finally
Console.WriteLine("El controlador de errores ha finalizado")
End Try
Console.ReadLine()
End Sub
Código fuente 360

En este caso que acabamos de ver, situaremos en primer lugar el manejador de excepciones de desbordamiento, y por último, el genérico.

No hay comentarios:

Publicar un comentario