You are on page 1of 36

Desarrollo de Aplicaciones

Capítulo 03
Control de Flujo y Excepciones

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Agenda
• Repaso sesión anterior.
• Control de flujo
– Branching
– Branching No-Condicional
– Branching Condicional (Control)
• if, else, else if
• switch
– Iteración y bucles
• do
• while
• for
• foreach
• Excepciones
– Introducción
– Sentencias try-catch
– Sentencias try-catch-finally
– Clase System.Exception
– Excepciones generadas por el compilador
– Jerarquía de las excepciones
– Excepciones personalizadas y mejores prácticas
• Que veremos la próxima sesión?

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Repaso sesión anterior

• Sintaxis C#
• Depuración básica
• Ver diapositivas previas.

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Control de Flujo

Referencias

1. Learning C# 2005. Caps. 5 (Branching)


2. Csharp Language Specification
3. MSDN C# Reference (http://msdn2.microsoft.com/en-us/library/618ayhy6(VS.80).aspx)
4. MSDN C# Programming Guide (http://msdn2.microsoft.com/en-
us/library/67ef8sbd(VS.80).aspx)

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Branching

• Las sentencias se ejecutan en un orden.


• A veces no se necesita ejecutar todo el código.
• Es necesario dirigir el “curso” de un programa.
• A veces es necesario ejecutar sentencias en base
a condiciones a lo largo del programa.
• Este proceso se denomina “branching”.
• Existen 2 tipos de branching:
– No Condicional (unconditional branching statements)
– Condicional (conditional branching statements)

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Branching No Condicional

• La forma simple de branching no


condicional es la llamada a un método.
• El compilador detiene la ejecución y
entrega al control al método llamado
hasta completar su ejecución.
• El compilador continúa con las
sentencias del programa principal (el que
invocó al método).
using System;
class Functions
{
static void Main( )
{
Console.WriteLine( "In Main! Calling SomeMethod( )..." ); In Main! Calling SomeMethod( )...
SomeMethod( ); Greetings from SomeMethod!
Console.WriteLine( "Back in Main( )." ); Back in Main( ).

}
static void SomeMethod( )
{
Console.WriteLine( "Greetings from SomeMethod!" );
}
}

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Branching Condicional

• El flujo del programa es controlado en base a la


evaluación de ciertas condiciones.
• Se realiza en tiempo de ejecución.
• Es soportado mediante las sentencias: if, else y
switch.

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Branching Condicional

• If, else, elseif:


– Si se requiere ejecutar múltiples sentencias, se deben
agrupar en bloque {..}
if (x > 10) if (x < 10) if (x < 10) if (x < 10)
HacerAlgo(); { { {
Hacer1(); Hacer1(); Hacer1();
Hacer2(); } }
} else else if (x > 20)
{ {
Hacer2(); Hacer2();
} }
else
{
Hacer3();
}

if (y > 20) bool flagCheck = true;


Console.Write("Statement_1"); if (flagCheck == true)
else {
Console.Write("Statement_2"); Console.WriteLine("The flag is set to true.");
}
else
{
Console.WriteLine("The flag is set to false.");
}
Desarrollo de aplicaciones .NET
Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Branching Condicional
using System;

• Switch: class Values


{
static void Main( )
{
int a = 0; String myChoice = "NewLeft";
switch(a) {
case 1:{ //CODIGO 1 // switch on the string value of myChoice
break; switch ( myChoice )
} {
case 2: { //CODIGO 2 case "NewLeft":
break; Console.WriteLine("The NewLeft members are voting Democratic." );
} goto case "Democrat";
default:{ //CODIGO DEFAULT case "Democrat":
break; Console.WriteLine( "You voted Democratic.\n" );
} break;
} case "CompassionateRepublican": // fall through
case "Republican":
Console.WriteLine( "You voted Republican.\n" );
Console.WriteLine( "Don't you feel compassionate?" );
break;
case "Progressive":
Console.WriteLine( "You voted Progressive.\n" );
break;
default:
Console.WriteLine( "You did not make a valid choice." );
break;
}
Console.WriteLine( "Thank you for voting." );
}
}
Desarrollo de aplicaciones .NET
Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Iteración y bucles

• Los bucles se crean usando sentencias de


iteración.
• Las sentencias de iteración permiten ejecutar
sentencias en forma repetida, sujetas a un
criterio de terminación.
• Las sentencias de iteración son: do-while,
for, foreach-in y while.

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Iteración y bucles

• do-while (C#)
– Se ejecuta repetidamente hasta que se cumple una condición.
– Se puede salir del bucle con break, goto, return o throw.

using System; Output:


public class TestDoWhile
{ 0
public static void Main () 1
{ 2
int x = 0; 3
do 4
{
Console.WriteLine(x);
x++;
} while (x < 5);
}
}

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Iteración y bucles

• for (C#)
– Se ejecuta repetidamente hasta que se cumple una condición.
– Se puede salir del bucle con break, goto, return o throw.

using System; Output:


class ForLoopTest
{ 1
static void Main() 2
{ 3
for (int i = 1; i <= 5; i++) 4
{ 5
Console.WriteLine(i);
}
}
}

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Iteración y bucles

• while (C#)
– Se ejecuta repetidamente hasta que se la condición sea false.
– Se puede salir del bucle con break, goto, return o throw.

using System; Output:


class WhileTest
{ Current value of n is 1
static void Main() Current value of n is 2
{ Current value of n is 3
int n = 1; Current value of n is 4
while (n < 6) Current value of n is 5
{
Console.WriteLine("Current value of n is {0}", n);
n++;
}
}
}

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Iteración y bucles

• foreach-in (C#)
– Ejecuta un grupo de sentencias para todos los elementos de un
array o colección.
– Se utiliza mayormente para iterar sobre una colección.
– No debe ser utilizado para para cambiar el contenido de la colección
recorrida.
– Se puede salir del bucle con break, goto, return o throw.
class ForEachTest Output:
{
static void Main(string[] args) 0
{ 1
int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 }; 2
foreach (int i in fibarray) 3
{ 5
System.Console.WriteLine(i); 8
} 13
}
}

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

Referencias

1. Learning C# 2005. Caps. 16 (Throwing and Catching Exceptions)


2. MSDN C# Reference (http://msdn2.microsoft.com/en-us/library/618ayhy6(VS.80).aspx)
3. MSDN C# Programming Guide (http://msdn2.microsoft.com/en-
us/library/67ef8sbd(VS.80).aspx)
4. Apress Ilustrated C Sharp 2005. Caps 11 (Exceptions)
5. MSDN Design Guidelines for Exceptions (http://msdn2.microsoft.com/en-
us/library/ms229014(VS.80).aspx)
6. MSDN Handling and Throwing Exceptions (http://msdn2.microsoft.com/en-
us/library/5b2yeyab(VS.80).aspx )

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Una excepción es el indicador de un problema: una mala


operación o situación anómala que ocurre durante la
ejecución de un programa.
• Las excepciones deben ser interceptadas y manejadas para
no desestabilizar el programa.
• Todas las excepciones son instancias de System.Exception
o de sus derivadas.
• El CLR provee un número amplio de excepciones
predefinidas: ArgumentNullException, InvalidCastException,
OverflowException, etc.
• Se pueden crear excepciones personalizadas derivando de
System.Exception.

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Manejando las excepciones:


– Las excepciones deben ser atrapadas y controladas para asegurar la
continuidad del programa.
– Si la función en ejecución C() no intercepta la excepción, se le da la
oportunidad a la función B() o función solicitante.
– Si B() no intercepta la excepción, se la da la oportunidad a la función A().
– Si A() no intercepta la excepción, el CLR la intercepta y termina el programa
en forma abrupta.
– Las excepciones se manejan con las sentencias: try - catch - finally.

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Esquema try-catch-finally:

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Sentencias try-catch:
– Encerrar cualquier código sospechoso de generar una excepción
dentro de un bloque try.
– Atrapar la excepción lanzada dentro del bloque catch.
– Consisten en un bloque try seguida de una o más cláusulas catch.
– No se pueden utilizar variables que han sido declaradas dentro de
un bloque try, fuera del mismo.
int SafeDivision(int x, int y)
{
try
{
return (x / y);
}
catch (System.DivideByZeroException dbz)
{
System.Console.WriteLine("Division by zero attempted!");
return 0;
}
}
Desarrollo de aplicaciones .NET
Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Cláusula catch/esquema:

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Cláusula catch:
– La cláusula catch puede ser utilizada sin argumentos, la cual
captura cualquier tipo de excepción.

public void Func2( )


{
Console.WriteLine( "Enter Func2..." );
try
{
Console.WriteLine( "Entering try block..." );
throw new ApplicationException( );

// this code never executes because of the exception


Console.WriteLine( "Exiting try block..." );
}
catch
{
Console.WriteLine( "Exception caught and handled!" );
}
Console.WriteLine( "Exit Func2..." );
}

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Cláusula catch:
– Pueden existir múltiples cláusulas catch, las cuales pueden tomar un
argumento de tipo objeto, derivado de System.Exception.
static void Main()
{
try
{
string s = null;
ProcessString(s);
}
// Most specific:
catch (ArgumentNullException e)
{
Console.WriteLine("{0} First exception caught.", e);
}
// Least specific:
catch (Exception e)
{
Console.WriteLine("{0} Second exception caught.", e);
}
}

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Cláusula catch/tipos:

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Sentencia throw:
– Las excepciones se pueden relanzar, para ser
recapturadas por el método solicitante, o capa superior.
– Se puede utilizar el catch sin parámetros para
excepciones no-manejadas por el CLR.
try try
{ {
// try to access a resource // try to access a resource
} }
catch catch (System.UnauthorizedAccessException e)
{ {
throw; // re-throw the error LogError(e); // call a custom error logging procedure
} throw e; // re-throw the error
// throw; // also works !!
}

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Sentencias try-catch-finally:
– El bloque finally es útil para limpiar y liberar recursos utilizados en el
bloque try. Se puede utilizar para cerrar conexiones a BD, cerrar
archivos, limpiar el buffer, etc.
– Se ejecuta después de la ejecución de los bloques try y catch.
– El bloque finally siempre se ejecuta, independiente del resultado del
bloque try. public class MainClass
{
try static void Main()
{ {
// Code to try here. int i = 123;
} string s = "Some string";
catch (System.Exception ex) object o = s;
{ try
// Code to handle exception here. {
} // Invalid conversion; „o‟ contains a string not an int
finally i = (int)o;
{ }
// Code to execute after try (and possibly catch) here. finally
} {
Console.Write("i = {0}", i);
}
}
Desarrollo de aplicaciones .NET }
Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Sentencias try-catch-finally:
– Esquema.

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones
• Sentencias try-catch-finally: static void CodeWithCleanup()
{
– Ejemplos. System.IO.FileStream file = null;
using System; System.IO.FileInfo fileInfo = null;
public class EHClass
{ try
static void Main() {
{ fileInfo = new System.IO.FileInfo("C:\\file.txt");
try
{
Console.WriteLine("Executing the try statement."); file = fileInfo.OpenWrite();
throw new NullReferenceException(); file.WriteByte(0xF);
} }
catch (NullReferenceException e) catch(System.Exception e)
{ {
Console.WriteLine("{0} Caught exception #1.", e);
}
System.Console.WriteLine(e.Message);
catch }
{ finally
Console.WriteLine("Caught exception #2."); {
} if (file != null)
finally {
{
Console.WriteLine("Executing finally block.");
file.Close();
} }
} }
} }

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• La Clase System.Exception
– Propiedad StackTrace (string / read-only)
• Devuelve una cadena con el nombre de los métodos de la pila.
• Devuelve el número de línea donde se generó la excepción en cada método.
– Propiedad Message (string / read-only)
• Devuelve una cadena explicativa de la razón de la excepción.
– Propiedad HelpLink (string / read-only)
• Se puede establecer para devolver un link con información de ayuda para resolver el
problema.

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Ejemplos de uso de la clase Exception:


public void Run( )
{
try
{
Console.WriteLine( "Open file here" );
double a = 12;
double b = 0;
Console.WriteLine( "{0} / {1} = {2}“, a, b, DoDivide( a, b ) );
Console.WriteLine("This line may or may not print" );
}

// most derived exception type first


catch (DivideByZeroException e )
{
Console.WriteLine(“DivideByZeroException! Msg: {0}“,e.Message );
Console.WriteLine(“HelpLink: {0}", e.HelpLink );
Console.WriteLine(“Here's a stack trace: {0}\n“, e.StackTrace );
}
catch
{
Console.WriteLine(
"Unknown exception caught" );
}
finally
{
Console.WriteLine(
"Close file here." );
}
}
Desarrollo de aplicaciones .NET
Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones
• Excepciones lanzadas por el compilador (CLR)
– Son lanzados cuando una operación básica falla.
Exception Description

A base class for exceptions that occur during arithmetic operations, such as
ArithmeticException
DivideByZeroException and OverflowException.

Thrown when an array cannot store a given element because the actual type of the element is
ArrayTypeMismatchException
incompatible with the actual type of the array.

DivideByZeroException Thrown when an attempt is made to divide an integral value by zero.

Thrown when an attempt is made to index an array when the index is less than zero or outside
IndexOutOfRangeException
the bounds of the array.

Thrown when an explicit conversion from a base type to an interface or to a derived type fails at
InvalidCastException
runtime.

NullReferenceException Thrown when you attempt to reference an object whose value is null.

Thrown when an attempt to allocate memory using the new operator fails. This indicates that the
OutOfMemoryException
memory available to the Common Language Runtime has been exhausted.

OverflowException Thrown when an arithmetic operation in a checked context overflows.

Thrown when the execution stack is exhausted by having too many pending method calls; usually
StackOverflowException
indicates a very deep or infinite recursion.

Thrown when a static constructor throws an exception and no compatible catch clause exists to
TypeInitializationException
catch it.

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Jerarquía de System.Exception

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Expansión de la jerarquía

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Excepciones personalizadas:
– No se cumple la expansión de la jerarquía en las mismas
clases base del NET Framework.
– Evitar jerarquías demasiado profundas.
– Derivar de System.Exception o otra excepción base.
– Terminar el nombre de la clase con el prefijo “Exception”.
– Hacer la excepción serializable para asegurar su
funcionamiento a través de las capas de la aplicación y
límites remotos (webservices, remoting).

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Excepciones

• Excepciones personalizadas:
– Proveer (por lo menos) los siguientes constructores:
public class SomeException: Exception, ISerializable {

public SomeException();
public SomeException(string message);
public SomeException(string message, Exception inner);

// this constructor is needed for serialization.


protected SomeException(SerializationInfo info, StreamingContext context);

– Evitar poner información de seguridad o sensible en el


método ToString() de la excepción.
– Considerar agregar propiedades a la clase con
información extra o adicional relativa a la excepción.

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Que veremos la próxima sesión?

• Arrays y Colecciones

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)
Fin de la sesión

• Dudas, comentarios, sugerencias?


• Comunicarse por email a eriveraa@gmail.com
• Gracias por su atención !!

Desarrollo de aplicaciones .NET


Eduardo Rivera Alva - MCTS.Net (eriveraa@gmail.com)

You might also like