Tabla de Contenido
0. Introducción
1. ArgumentException
2. ArgumentNullException
3. ARgumentOutOfRangeException
4. DivideByZeroException
5. IndexOutOfRangeException
6. InvalidCastException
7. InvalidOperationException
8. NullReferenceException
9. OverflowException
10. Conclusiones
11. Glosario
12. Literatura & Enlaces
0. Introducción
Quinta y última parte de la serie de artículos dedicados a la comprensión y tratamiento de excepciones en C#. En esta oportunidad vamos a realizar varios ejemplos (9, precisamente) acerca del uso de excepciones generadas en tiempo de ejecución. Todas estas excepciones (las que aquí trataremos) forman parte de la biblioteca base de clases de Microsoft .NET Framework. Entonces procedamos a desarrollar estos ejemplos para afianzar el conocimiento adquirido durante las 4 partes anteriores:
1. ArgumentException
La excepción ArgumentException se lanza cuando uno de los argumentos que se pasan a un método no es válido [3]. Para el lanzamiento de esta excepción, se recomienda pasar un mensaje a la instancia de esta excepción, que tenga significado tanto para el programador como para el usuario del código; esto con el fin de facilitar la interpretación y corrección de errores con mayor agilidad.
En [3] nos advierten que a partir de esta clase derivan otras dos:
- ArgumentNullException: cuando el valor null es pasado como argumento a un método.
- ArgumentOutOfRange: cuando el valor de un argumento excede un rango establecido para la lógica de un método.
las cuales trataremos más adelante con detalles de ejemplos y descriptivos.
Ejemplo de uso:
Cuando al método DividirPorDos (líneas 8-18) le pasamos un valor de argumento que no es divisible por dos (línea 12), en la línea 14 se crea y se lanza una instancia de la excepción ArgumentException. En el código cliente (líneas 20-35) tratamos esta excepción en el bloque try-catch de las líneas 25-34. Cuando se genera esta excepción, en pantalla mostramos un mensaje que señala la causa y el nombre del argumento que la generó (línea 33.
Compilación:
csc /target:exe UsoArgumentException.cs
Ejecución assembly:
.\UsoArgumentException.exe
> Prueba de ejecución (ideone.com).
> Prueba de ejecución (local):
|
Figura 1. Ejecución aseembly UsoArgumentException.exe. |
2. ArgumentNullException
La excepción ArgumentNullException [4] se lanza cuando una referencia null es pasada a un método que no acepta este valor. Además, y de acuerdo con [4], esta excepción se genera cuando el programador o desarrollador ha efectuado una de estas operaciones:
- Uno o varios de los argumentos que no aceptan referencias null, ha(n) sido asociado(s) con un valor de esta naturaleza. Para remediar este problema, lo único que hay que hacer es crear una instancia del objeto que se será pasado como argumento.
- En una cadena de llamada a métodos, uno de ellos retorna una referencia null.
Ejemplo de uso:
De manera análoga al ejemplo de la sección 1, en este caso, el método, MostrarMensaje valida cuando el argumento mensaje contiene una referencia null (línea 12). La excepción es tratada en el bloque catch de las líneas 31-34.
Compilación:
csc /target:exe UsoArgumentNullException.cs
Ejecución assembly:
.\UsoArgumentNullException.exe
> Prueba de ejecución (ideone.com).
> Prueba de ejecución (local):
|
Figura 2. Ejecucón assembly UsoArgumentNullException.exe. |
3. ArgumentOutOfRangeException
La excepción ArgumentOutOfRangeException [5] se lanza cuando el valor de un argumenta está por fuera de los límites inferior y superior. Esta excepción asume que el argumento no contiene una referencia igual a null [5]. Por otro lado, la excepción ArgumentOutRangeException se usa recurrentemente por clases de los namespace System.Collections y System.IO; y también por la clase Array.
Ejemplo de uso:
Archivo C# UsoArgumentOutOfRangeException.cs [enlace alternativo]:
En el constructor (líneas 11-25) de la clase Invitado, se valida la edad del invitado; en caso de que esta sea menor o igual a 30, se lanza la excepción ArgumentOutOfRangeException, a la cual se añade la información sobre el parámetro con el valor inválido, y un mensaje indicativo del error o problema.
En el método Main se crea una instancia (línea 45) de Invitado con la edad por debajo del valor admitido.
Compilación:
csc /target:exe UsoArgumentOutOfRangeException.cs
Ejecución assembly:
.\UsoArgumentOutOfRangeException.exe
> Prueba de ejecución (ideone.com).
> Prueba de ejecución (local):
|
Figura 3. Ejecución assembly UsoArgumentOutOfRangeException.exe. |
4. DivideByZeroException
La excepción DivideByZeroException [6] se lanza cuando se intenta dividir un número entero entre cero (0). A diferencia de los enteros, los números de punto flotante (i.e., float, double) no generan esta excepción en un intento de división entre cero. (Más información en [6].)
Ejemplo de uso:
Dentro del bloque try se intenta realizar una división entre cero, dado que la variable divisor tiene asignado el número cero (línea 10). Cuando esto ocurre, se genera la excepción DivideByZeroException, y se muestra un mensaje de error en pantalla (línea 18).
Compilación:
csc /target:exe UsoDivideByZeroException.cs
Ejecución assembly:
.\UsoDivideByZeroException.exe
> Prueba de ejecución (ideone.com):
> Prueba de ejecución (local):
|
Figura 4. Ejecución assembly UsoDivideByZeroException.exe. |
5. IndexOutOfRangeException
Para las estructuras de datos lineales, como los arreglo, esta excepción -IndexOutOfRangeException [7]- se genera en el intento de sobrepasar los límites inferior y superior del arreglo.
Ejemplo de uso:
En el bloque try (líneas 17-22) sobre el método WriteLine se hace uso del valor del indíce 5 para acceder al elemento en esa posición (el cual no existe, en este caso supera el límite superior del arreglo), y generará la excepción IndexOutOfRangeException.
Compilación:
csc /target:exe UsoIndexOutOfRangeException.cs
Ejecución assembly:
.\UsoIndexOutOfRangeException.exe
> Prueba de ejecución (ideone.com).
> Prueba de ejecución (local):
|
Figura 5. Ejecución assembly UsoIndexOutOfRangeException.exe. |
6. InvalidCastException
Los intentos fallidos de conversión implícita o explícita de tipos (e.g., interfaz, clase) generan la excepción InvalidCastException [8].
Ejemplos de uso:
Tenemos la jerarquía explicitada en las líneas 5 y 6: B hereda de A.
En la línea 14 creamos una instancia de A, luego, sobre la línea 22 intentamos de realizar una conversión explícita con el operador (), la cual falla debido a que la conversión en un tipo superior (superclase) a uno inferior (subclase) en la jerarquía de herencia no está permitida según los principios de programación orientada objetos.
Compilación:
csc /target:exe UsoInvalidCastException.cs
Ejecución assembly:
.\UsoInvalidCastException.exe
> Prueba de ejecución (ideone.com).
> Prueba de ejecución (local):
|
Figura 6. Ejecución assembly UsoInvalidCastException.exe. |
7. InvalidOperationException
El intentar realizar una invocación de los métodos de instancia sobre una instancia cuyo estado actual es inválido, se lanza la excepción InvalidOperationException. El ejemplo más clásico, consiste en invocar un método sobre una variable cuya referencia actual es null.
Ejemplo de uso:
Creamos una instancia de StreamWriter en la línea 11; agregamos dos líneas al archivo: líneas 13 y 14. Decidimos cerrar el archivo: invocamos al método Close (línea 17). Dentro del bloque try hacemos el intento de agregar una nueva línea al archivo, pero falla, debido a que el archivo ha sido cerrado previamente, luego, se genera la excepción InvalidCastOperationException.
Compilación:
csc /target:exe UsoInvalidOperationException.cs
Ejecución assembly:
.\UsoInvalidOperationException.exe
> Prueba de ejecución:
|
Figura 7. Ejecución assembly UsoInvalidOperationException.exe. |
8. NullReferenceException
La excepción NullReferenceException [10] se lanza cuando se intenta acceder o manipular el estado de un variable que tiene asignada la referencia null.
Ejemplo de uso:
En la línea 12 definimos una variable de ArrayList, sin embargo le asignamos la referencia null. El hecho de intentar de invocar sobre el estado actual de esta variable, cualquier método generará la excepción NullReferenceException: línea 18.
Compilación:
csc /target:exe UsoNullReferenceException.cs
Ejecución assembly:
.\UsoNullReferenceException.exe
> Prueba de ejecución (ideone.com).
> Prueba de ejecución (local):
|
Figura 8. Ejecución assembly UsoNullReferenceException.exe. |
9. OverflowException
Para operaciones aritméticas o de conversiones que sobrepasan los límites de memoria de tipos de datos (e.g., enteros).
Ejemplo de uso:
La operación de suma en la línea 12 genera la excepción OverflowException debido a que se sobrepasa la capacidad de almacenamiento para el tipo de entero de 32 bits: Int32.
Compilación:
csc /target:exe UsoOverflowException.cs
Ejecución assembly:
.\UsoOverflowException.exe
> Prueba de ejecución (ideone.com).
> Pueba de ejecución (local):
|
Figura 9. Ejecución assembly UsoOverflowException.exe. |
10. Conclusiones
Evidentemente en la biblioteca base de clases del Framework .NET existen centenares de clases de excepción especializadas para situaciones de error o excepcionales, sin embargo aquí he mencionado solo nueve de ellas; y todo esto tiene como invitación a considerar el uso de este tipo de elementos de programa en nuestros desarrollos ya sea para propósitos académicos y/o comerciales, debido a que las soluciones de software construidas serán más tolerantes a fallas o errores en su ejecución. Con esta última parte damos fin a la serie de excepciones en C#, empero, en futuras entregas de artículos, recetas, aplicaciones, &c., seguiremos resaltando su uso en las situaciones donde sea necesario o indispensable.
11. Glosario
- Arreglo
- Casting
- Conversión
- Excepción
- Exception
- Explícita
- Implícita
- Índice
12. Literatura & Enlaces
[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: List down the commonly used types of exceptions in .Net? - http://www.c-sharpcorner.com/Interviews/answer/7280/list-down-the-commonly-used-types-of-exceptions-in-net
[3]: ArgumentException Class (System) - http://msdn.microsoft.com/en-us/library/system.argumentexception%28v=vs.110%29.aspx
[4]: ArgumentNullException Class (System) - http://msdn.microsoft.com/en-us/library/system.argumentnullexception%28v=vs.110%29.aspx
[5]: ArgumentOutOfRangeException Class (System) - http://msdn.microsoft.com/en-us/library/system.argumentoutofrangeexception%28v=vs.110%29.aspx
[6]: DivideByZeroException Class (System) - http://msdn.microsoft.com/en-us/library/system.dividebyzeroexception%28v=vs.110%29.aspx
[7]: IndexOutOfRangeException Class (System) - http://msdn.microsoft.com/en-us/library/system.indexoutofrangeexception%28v=vs.110%29.aspx
[8]: InvalidCastException Class (System) - http://msdn.microsoft.com/en-us/library/system.invalidcastexception%28v=vs.110%29.aspx
[9]: InvalidOperationException Class (System) - http://msdn.microsoft.com/en-us/library/system.invalidoperationexception%28v=vs.110%29.aspx
[10]: NullReferenceException Class (System) - http://msdn.microsoft.com/en-us/library/system.nullreferenceexception%28v=vs.110%29.aspx
[11]: OverflowException Class (System) - http://msdn.microsoft.com/en-us/library/system.overflowexception%28v=vs.110%29.aspx
J