Sesión 03 - Control y Excepciones

36
Desarrollo de aplicaciones .NET Eduardo Rivera Alva - MCTS.Net ([email protected]) Desarrollo de Aplicaciones Capítulo 03 Control de Flujo y Excepciones

description

Sesión 03 del Curso Desarrollo de Aplicaciones .NET (2007-II) - Universidad San Ignacio de Loyola (USIL)

Transcript of Sesión 03 - Control y Excepciones

Page 1: Sesión 03 - Control y Excepciones

Desarrollo de aplicaciones .NETEduardo Rivera Alva - MCTS.Net ([email protected])

Desarrollo de Aplicaciones

Capítulo 03

Control de Flujo y Excepciones

Page 2: Sesión 03 - Control y Excepciones

Desarrollo de aplicaciones .NETEduardo Rivera Alva - MCTS.Net ([email protected])

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?

Page 3: Sesión 03 - Control y Excepciones

Desarrollo de aplicaciones .NETEduardo Rivera Alva - MCTS.Net ([email protected])

Repaso sesión anterior

• Sintaxis C#

• Depuración básica

• Ver diapositivas previas.

Page 4: Sesión 03 - Control y Excepciones

Control de Flujo

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

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)

Page 5: Sesión 03 - Control y Excepciones

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 ([email protected])

Page 6: Sesión 03 - Control y Excepciones

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).

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

using System;

class Functions

{

static void Main( )

{

Console.WriteLine( "In Main! Calling SomeMethod( )..." );

SomeMethod( );

Console.WriteLine( "Back in Main( )." );

}

static void SomeMethod( )

{

Console.WriteLine( "Greetings from SomeMethod!" );

}

}

In Main! Calling SomeMethod( )...

Greetings from SomeMethod!

Back in Main( ).

Page 7: Sesión 03 - Control y Excepciones

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 ([email protected])

Page 8: Sesión 03 - Control y Excepciones

Branching Condicional

• If, else, elseif:

– Si se requiere ejecutar múltiples sentencias, se deben

agrupar en bloque {..}

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

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();

}

bool flagCheck = true;

if (flagCheck == true)

{

Console.WriteLine("The flag is set to true.");

}

else

{

Console.WriteLine("The flag is set to false.");

}

if (y > 20)

Console.Write("Statement_1");

else

Console.Write("Statement_2");

Page 9: Sesión 03 - Control y Excepciones

Branching Condicional

• Switch:

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

int a = 0;

switch(a) {

case 1:{ //CODIGO 1

break;

}

case 2: { //CODIGO 2

break;

}

default:{ //CODIGO DEFAULT

break;

}

}

using System;

class Values

{

static void Main( )

{

String myChoice = "NewLeft";

// switch on the string value of myChoice

switch ( myChoice )

{

case "NewLeft":

Console.WriteLine("The NewLeft members are voting Democratic." );

goto case "Democrat";

case "Democrat":

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." );

}

}

Page 10: Sesión 03 - Control y Excepciones

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 ([email protected])

Page 11: Sesión 03 - Control y Excepciones

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.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

using System;

public class TestDoWhile

{

public static void Main ()

{

int x = 0;

do

{

Console.WriteLine(x);

x++;

} while (x < 5);

}

}

Output:

0

1

2

3

4

Page 12: Sesión 03 - Control y Excepciones

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.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

using System;

class ForLoopTest

{

static void Main()

{

for (int i = 1; i <= 5; i++)

{

Console.WriteLine(i);

}

}

}

Output:

1

2

3

4

5

Page 13: Sesión 03 - Control y Excepciones

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.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

using System;

class WhileTest

{

static void Main()

{

int n = 1;

while (n < 6)

{

Console.WriteLine("Current value of n is {0}", n);

n++;

}

}

}

Output:

Current value of n is 1

Current value of n is 2

Current value of n is 3

Current value of n is 4

Current value of n is 5

Page 14: Sesión 03 - Control y Excepciones

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.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

class ForEachTest

{

static void Main(string[] args)

{

int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };

foreach (int i in fibarray)

{

System.Console.WriteLine(i);

}

}

}

Output:

0

1

2

3

5

8

13

Page 15: Sesión 03 - Control y Excepciones

Excepciones

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

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 )

Page 16: Sesión 03 - Control y Excepciones

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 ([email protected])

Page 17: Sesión 03 - Control y Excepciones

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 ([email protected])

Page 18: Sesión 03 - Control y Excepciones

Excepciones

• Esquema try-catch-finally:

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

Page 19: Sesión 03 - Control y Excepciones

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.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

int SafeDivision(int x, int y)

{

try

{

return (x / y);

}

catch (System.DivideByZeroException dbz)

{

System.Console.WriteLine("Division by zero attempted!");

return 0;

}

}

Page 20: Sesión 03 - Control y Excepciones

Excepciones

• Cláusula catch/esquema:

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

Page 21: Sesión 03 - Control y Excepciones

Excepciones

• Cláusula catch:

– La cláusula catch puede ser utilizada sin argumentos, la cual

captura cualquier tipo de excepción.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

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..." );

}

Page 22: Sesión 03 - Control y Excepciones

Excepciones

• Cláusula catch:– Pueden existir múltiples cláusulas catch, las cuales pueden tomar un

argumento de tipo objeto, derivado de System.Exception.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

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);

}

}

Page 23: Sesión 03 - Control y Excepciones

Excepciones

• Cláusula catch/tipos:

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

Page 24: Sesión 03 - Control y Excepciones

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.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

try

{

// try to access a resource

}

catch

{

throw; // re-throw the error}

try

{

// try to access a resource

}

catch (System.UnauthorizedAccessException e)

{

LogError(e); // call a custom error logging procedure

throw e; // re-throw the error

// throw; // also works !!}

Page 25: Sesión 03 - Control y Excepciones

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.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

public class MainClass

{

static void Main()

{

int i = 123;

string s = "Some string";

object o = s;

try

{

// Invalid conversion; „o‟ contains a string not an int

i = (int)o;

}

finally

{

Console.Write("i = {0}", i);

}

}

}

try

{

// Code to try here.

}

catch (System.Exception ex)

{

// Code to handle exception here.

}

finally

{

// Code to execute after try (and possibly catch) here.

}

Page 26: Sesión 03 - Control y Excepciones

Excepciones

• Sentencias try-catch-finally:

– Esquema.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

Page 27: Sesión 03 - Control y Excepciones

Excepciones

• Sentencias try-catch-finally:

– Ejemplos.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

static void CodeWithCleanup()

{

System.IO.FileStream file = null;

System.IO.FileInfo fileInfo = null;

try

{

fileInfo = new System.IO.FileInfo("C:\\file.txt");

file = fileInfo.OpenWrite();

file.WriteByte(0xF);

}

catch(System.Exception e)

{

System.Console.WriteLine(e.Message);

}

finally

{

if (file != null)

{

file.Close();

}

}

}

using System;

public class EHClass

{

static void Main()

{

try

{

Console.WriteLine("Executing the try statement.");

throw new NullReferenceException();

}

catch (NullReferenceException e)

{

Console.WriteLine("{0} Caught exception #1.", e);

}

catch

{

Console.WriteLine("Caught exception #2.");

}

finally

{

Console.WriteLine("Executing finally block.");

}

}

}

Page 28: Sesión 03 - Control y Excepciones

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 ([email protected])

Page 29: Sesión 03 - Control y Excepciones

Excepciones

• Ejemplos de uso de la clase Exception:

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

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." );

}

}

Page 30: Sesión 03 - Control y Excepciones

Excepciones

• Excepciones lanzadas por el compilador (CLR)

– Son lanzados cuando una operación básica falla.

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

Exception Description

ArithmeticExceptionA base class for exceptions that occur during arithmetic operations, such as

DivideByZeroException and OverflowException.

ArrayTypeMismatchExceptionThrown when an array cannot store a given element because the actual type of the element is

incompatible with the actual type of the array.

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

IndexOutOfRangeExceptionThrown when an attempt is made to index an array when the index is less than zero or outside

the bounds of the array.

InvalidCastExceptionThrown when an explicit conversion from a base type to an interface or to a derived type fails at

runtime.

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

OutOfMemoryExceptionThrown when an attempt to allocate memory using the new operator fails. This indicates that the

memory available to the Common Language Runtime has been exhausted.

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

StackOverflowExceptionThrown when the execution stack is exhausted by having too many pending method calls; usually

indicates a very deep or infinite recursion.

TypeInitializationExceptionThrown when a static constructor throws an exception and no compatible catch clause exists to

catch it.

Page 31: Sesión 03 - Control y Excepciones

Excepciones

• Jerarquía de System.Exception

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

Page 32: Sesión 03 - Control y Excepciones

Excepciones

• Expansión de la jerarquía

Desarrollo de aplicaciones .NET

Eduardo Rivera Alva - MCTS.Net ([email protected])

Page 33: Sesión 03 - Control y Excepciones

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 ([email protected])

Page 34: Sesión 03 - Control y Excepciones

Excepciones

• Excepciones personalizadas:

– Proveer (por lo menos) los siguientes constructores:

– 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 ([email protected])

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);

Page 35: Sesión 03 - Control y Excepciones

Que veremos la próxima sesión?

• Arrays y Colecciones

Desarrollo de aplicaciones .NETEduardo Rivera Alva - MCTS.Net ([email protected])

Page 36: Sesión 03 - Control y Excepciones

Desarrollo de aplicaciones .NETEduardo Rivera Alva - MCTS.Net ([email protected])

Fin de la sesión

• Dudas, comentarios, sugerencias?

• Comunicarse por email a [email protected]

• Gracias por su atención !!