Logged in as Registrarse/Entrar :
Views:
Herramientas:

Libro para desarrolladores en Mono:Capítulo 2

De Mono Hispano

  1. (comunmente llamado C-gato o en inglés C-Sharp), es un lenguaje con una sintaxis similar a C, C++ o Java. Es un lenguaje diseñado por Microsoft muy parecido a Java en su simplicidad y tal vez el más representativo de la plataforma .NET, estandarizado por ECMA (ECMA-334). Debido a sus mejoras derivadas de otros lenguajes (propiedades, delegados, atributos), la velocidad de programación provee un alto nivel de productividad.

Contents

Primer Programa con Mono

Como en todos los lenguajes de programación es clásico el programa de "Hola Mundo", así que a continuación veremos el ejemplo en C#:

using System;

class Hola
{
  static void Main()
  {
     Console.WriteLine ("Hola Mundo");
  }
}

Modelar el comportamiento de cosas de la vida real

Evitar sobrecarga mientras se pasan los datos

Manejo de errores inesperados

C# es un Lenguaje administrado, una de las características más interesantes de .Net es la capacidad para manejar Excepciones. Podemos definir una excepción con un comportamiento anómalo dentro de la aplicación. Cuando por ejemplo vamos a leer un fichero desde disco y ese fichero no existe, o vamos a conectarnos a una base de datos, pero no esta disponible en ese momento. C# dispone de tres palabras clave para trabajar con excepciones try,catch, finally, con las cuales podemos definir que hacer en caso de que se produzca una excepción y como tratarla. Veamos un ejemplo.


using System;
using System.IO;

namespace ExcepcionesEjmplo{

	class Excepciones{
		public static void Main(string[] args){
			// Ruta del fichero a leer.
			string ruta = @"C:\fichero.txt";
			// Probamos a leer el fichero
			try{
				
				StreamReader lector = new StreamReader(ruta);
				string contenido = lector.ReadToEnd();
			}
			catch(FileNotFoundException ex){
				Console.WriteLine("No se ha encontrado el fichero");
			}
		}
	}
}

Todas la excepciones son clases que derivan de System.Exception que es la clase base de todas las excepciones de .Net, si nosotros queremos personalizar las acciones dependiendo del tipo de excepción tendremos que usar una excepción especifica para la acción que queremos tratar en caso de comportamiento anómalo, podemos tener todos lo catch que queramos por cada try. En el ejemplo de antes solamente tratamos la excepción de fichero no encontrado, pero si durante la lectura se produce un error, este no será tratado para ello tendríamos que haber escrito otro catch más, veámoslo.

using System;
using System.IO;

namespace ExcepcionesEjmplo{

	class Excepciones{
		public static void Main(string[] args){
			// Ruta del fichero a leer.
			string ruta = @"C:\fichero.txt";
			// Probamos a leer el fichero
			try{
				
				StreamReader lector = new StreamReader(ruta);
				string contenido = lector.ReadToEnd();
			}
			catch(FileNotFoundException ex){
				Console.WriteLine("No se ha encontrado el fichero");
			}
			catch(IOException ex2){
				Console.WriteLine("Se ha producido un error en la lectura");
			}
		}
	}
}

En el ejemplo anterior, si hubiese mas codigo y se produciese algun error que no fuese del tipo FileNotFoundException o IOException no se controlaria, y nuestro programa fallaria sin capturar ningun error. Para que esto no ocurra usaremos el bloque catch de excepcion general ( que utiliza el objeto "padre" de las excepciones -> System.Exception ), es decir, capturara todas las excepcion da igual del tipo que sean. De esta forma podemos utilizar un unico catch en lugar de uno especifico para cada tipo de error, pero tendremos menos control del error que ha producido. Un ejemplo de uso:

   try{
    bloque de ordenes que pueden provocar un error
   }
   catch( Exception e ){
     Console.WriteLine( e.ToString() );
   }

En el caso del ejemplo de varios catch anterior. Si incluimos un catch como este, debemos asegurarnos que esta EL ULTIMO DE LOS BLOQUES CATCH, ya que si no, nunca llegará a los catch que esten por debajo de este. Esto es porque el modo de funcionar de los bloques try...catch es el siguiente:

1 Se produce un error
2 ¿Que tipo de error se produce?
3 Busco en los bloques catch asociados al try un error de mi tipo
4 Si lo encuentro ejecuto el catch y me salgo del bloque try...catch
5 Si no hay ninguno propago la excepcion al bloque padre.

Por ello si encuentra primero el bloque general, entra, se ejecuta, y sale del bloque try catch, no llegando nunca a los demas bloques catch ( ni siquiera a evaluarlos ).

using System;
using System.IO;

namespace ExcepcionesEjmplo{

	class Excepciones{
		public static void Main(string[] args){
			// Ruta del fichero a leer.
			string ruta = @"C:\fichero.txt";
			// Probamos a leer el fichero
			try{
				
				StreamReader lector = new StreamReader(ruta);
				string contenido = lector.ReadToEnd();
			}
			catch(FileNotFoundException ex){
				Console.WriteLine("No se ha encontrado el fichero");
			}
			catch(IOException ex2){
				Console.WriteLine("Se ha producido un error en la lectura");
			}
                        catch(Exception egeneral){
                                Console.WriteLine("Error no controlado en ningun otro catch" + egeneral.ToString() );
                        }
		}
	}
}


La otra palabra reservada finally es opcional y se puede incluir para ejecutar algo independientemente de que se halla producido la excepción o no. Esta parte del código siempre se va a ejecutar. Veamos un ejemplo.

using System;
using System.IO;

namespace ExcepcionesEjmplo{

	class Excepciones{
		public static void Main(string[] args){
			// Ruta del fichero a leer.
			string ruta = @"C:\fichero.txt";
			StreamReader lector = null;
			// Probamos a leer el fichero
			try{
				lector = new StreamReader(ruta);
				string contenido = lector.ReadToEnd();
			}
			catch(FileNotFoundException ex){
				Console.WriteLine("No se ha encontrado el fichero");
			}
			catch(IOException ex2){
				Console.WriteLine("Se ha producido un error en la lectura");
			}
			finally{
				if(lector != null){
					lector.Close();
				}
			}
		}
	}
}

Definir punteros a función

Invocación Nativa