Anuncios

Bienvenidos sean a este post, hoy veremos un tema puntual como es la manipulacion de los errores que nos puede devolver nuestro codigo.

Anuncios

Al igual que otros lenguajes a los errores no se los denomina de esta forma sino como excepciones y por distintos metodos podremos interceptar a los mismos y manejarlos, si bien hemos visto algunos errores en algunos ejemplos hoy veremos como poder adaptar la salida que mostraremos al usuario, hablemos de los primeros metodos.

Anuncios

Try/Catch

Estos son los modulos basicos que usaremos para interceptar nuestros errores, el metodo try sera el que mira el codigo y el metodo catch sera el encargado de enviarnos una notificacion en caso de que try encontrase un error, su sintaxis es la siguiente:

try
{
… instrucciones …
}
catch(Exception e)
{
… instrucciones …
}
Anuncios

En este caso siempre ira primero el try donde le pondremos las instrucciones a analizar y luego el catch con la excepcion por medio de la clase Exception y tambien tendremos las instrucciones a mostrar, del metodo try podemos tener uno solo pero si podemos tener multiples catch para intereceptar diferentes tipos de errores.

Anuncios
Nota: los metodos try y catch van de a pares, para que try funcione debe tener al menos un catch
Anuncios

Para entender mejor el concepto vamos a usar el siguiente ejemplo:

saludo.cs

using System;

public class Program
{
	static int Main(string[] args)
	{
		Console.WriteLine("Hola, " + args[0]);
		return 0;
	}
}
Anuncios

Este es un programa sencillo donde implementaremos un concepto que ya vimos como es args, y explicando su funcionalidad de una manera sencilla este es un array que recibe valores al momento de llamar al archivo, luego podemos invocarlo como se ve ahi, simplemente llamando a args con la posicion, en este caso le pasaremos un argumento que sera nuestro nombre o el que quieran y nos saludara, si lo compilamos veremos esta salida:

C:\Users\tinchicus\Documents\Visual Studio 2019>saludo Tinchicus
Hola, Tinchicus

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Pero que pasa si nosotros no informamos un nombre? es decir que el argumento este vacio, sucede esto:

C:\Users\tinchicus\Documents\Visual Studio 2019>saludo

Excepción no controlada: System.IndexOutOfRangeException: Índice fuera de los lí
mites de la matriz.
   en Program.Main(String[] args)

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Como pueden ver nos devolvio un error de que el indice del array esta fuera del rango, para modificar esta notificacion vamos a modificar el codigo de la siguiente manera:

using System;

public class Program
{
	static int Main(string[] args)
	{
		try
		{
			Console.WriteLine("Hola, " + args[0]);
		}
		catch(Exception e)
		{
			Console.WriteLine("Debes pasar un nombre");
		}
		return 0;
	}
}
Anuncios

En este nuevo codigo vemos como se implementa try, donde monitorea el mensaje de salida, si ocurre un error pasara al catch donde mostrara un mensaje en pantalla para despues salir, si lo compilamos y probamos veremos la siguiente salida al llamar solo el archivo:

C:\Users\tinchicus\Documents\Visual Studio 2019>saludo.exe
Debes pasar un nombre

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Y si lo probamos como deberia ser nos devolvera la siguiente salida:

C:\Users\tinchicus\Documents\Visual Studio 2019>saludo.exe Tinchicus
Hola, Tinchicus

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Como podemos observar los metodos try/catch solamente actuaran con una excepcion sino ocurre el programa seguira funcionando de forma correcta, si el programa fuera mas complejo y tuvieramos que manejar mas excepciones deberemos agregar mas metodos catch para manejarlos, nuestro siguiente tema sera finally.

Anuncios

finally

La palabra finally lo usamos para ejecutar un codigo despues de utilizar el catch mas alla del resultado, equivale al else y va al final es decir despues del ultimo catch, vamos a tomar el codigo anterior y lo modifcaremos de la siguiente manera:

using System;

public class Program
{
	static int Main(string[] args)
	{
		try
		{
			Console.WriteLine("Hola, " + args[0]);
		}
		catch(Exception e)
		{
			Console.WriteLine("Debes pasar un nombre");
		}
		finally
		{
			Console.Write("Se acabo el bloque try/catch");
		}
		return 0;
	}
}
Anuncios

En este caso solo agregamos el bloque que posee a finally donde nos mostrara un mensaje, si lo compilamos y probamos sucedera lo siguiente:

C:\Users\tinchicus\Documents\Visual Studio 2019>saludo.exe
Debes pasar un nombre
Se acabo el bloque try/catch
C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Como pueden ver nos aparece el mensaje del finally despues de ejecutado el catch pero que sucede si lo ejecutamos correctamente:

C:\Users\tinchicus\Documents\Visual Studio 2019>saludo.exe tinchicus
Hola, tinchicus
Se acabo el bloque try/catch
C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Exactamente lo mismo porque como dijimos anteriormente el finally se ejecutara no importa si nos dio error o no, por este tema en muchos lenguajes es opcional con respecto a estos bloques, en otros lenguajes como C, si no me falla la memoria, es obligatorio, el ultimo tema que veremos es throw.

Anuncios

throw

Anuncios

La funcion throw nos permite crear excepciones propias para nuestros programas, para manejarlos debemos usar una de las clases de excepcion, a continuacion les dejo un listado de algunas de las disponibles:

  • Exception
  • SystemException
  • IndexOutOfRangeException
  • NullReferenceException
  • AccessViolationException
  • InvalidOperationException
  • ArgumentException
  • ArgumentNullException

Por ejemplo para el codigo que estamos haciendo pruebas esta relacionado cn el IndexOutOfRangeException porque en este caso cuando no informamos un argumento intenta trabajar con un indice que puede no existir, vamos a crear un ejemplo nuevo llamado edad.cs:

edad.cs

using System;

public class Program
{
   static int Main()
   {
      int edad;
      Console.Write("Ingresa tu edad: ");
      edad = int.Parse(Console.ReadLine());
      chequear(edad);
      return 0;
   }

   static void chequear(int edad)
   {
      if (edad < 18)
         throw new ArithmeticException("Acceso denegado - Debes ser mayor");
      else
         Console.WriteLine("Pase señor Mayor");
   }
}
Anuncios

En este codigo le pediremos al usuario que ingrese su edad, la cual la almacenaremos en la variable edad, luego la enviaremos a la funcion chequear, lo siguiente es la funcion chequear, donde recibe a edad, aqui tendremos un condicional donde verifica si edad es menor a 18, en caso de ser cierto utilizamos esta linea:

throw new ArithmeticException("Acceso denegado - Debes ser mayor");
Anuncios

Aca le decimos que lance un mensaje de excepcion de tipo arimetico, con un mensaje personalizado, en caso contrario mostrara un mensaje de notificacion que anduvo correctamente, vamos a compilarlo y probarlo como se ve en el siguiente video

Anuncios

Aca vemos como funcionan las dos condiciones, primero por medio de throw cuando no funciona de la manera que queremos y el otro donde funciona perfecto, vamos a mejorar un poco este codigo de la siguiente manera:

edad.cs

using System;

public class Program
{
	static int Main()
	{
	int edad;
	Console.Write("Ingresa tu edad: ");
	edad = int.Parse(Console.ReadLine());
	try
	{
		chequear(edad);
	}
	catch (ArithmeticException e)
	{
		Console.WriteLine("Acceso denegado - Debes ser mayor");
	}
	return 0;
	}

	static void chequear(int edad)
	{
	if (edad < 18)
		throw new ArithmeticException();
	else
		Console.WriteLine("Pase señor Mayor");
	}
}

Estas modificaciones son simples e implementamos un par de las vistas anteriormente como son try/catch, la unica modificacion que hicimos en el Main fue rodear la llamada a chequear de la siguiente manera:

	try
	{
		chequear(edad);
	}
	catch (ArithmeticException e)
	{
		Console.WriteLine("Acceso denegado - Debes ser mayor");
	}

En este bloque vemos que el try solamente interceptara lo que ocurra con chequear, y en el catch le decimos que intercepte la excepcion ArithmeticException, le asignamos un nombre pero es simplemente para que no nos devuelva un error, en el bloque del catch mostraremos el mensaje que lanzabamos antes, la otra modificacion la hicimos en la funcion chequear:

	static void chequear(int edad)
	{
	if (edad < 18)
		throw new ArithmeticException();
	else
		Console.WriteLine("Pase señor Mayor");
	}

En este metodo sacamos el mensaje pero le seguimos diciendo que mientras sea menor a 18 lance esa excepcion, la cual sera interceptada por catch, veamos como queda mediante el siguiente video

En el video podemos observar como sigue con la misma conducta pero ahora no tenemos al depurador y vemos mas claro como se envio la excepcion, fue capturada por catch ahora que especificamos al cual debe interceptar y por ultimo vimos la falla pero como tambien funciona correctamente.

Anuncios

En resumen, hoy hemos visto que son las excepciones, la forma que tenemos para manipularla, cuales son las ventajas que podemos ganar mediante el uso de estas funciones, tambien vimos como podemos lanzar una excepcion dependiendo de nuestras necesidades, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00