Publicado el 29 de Julio del 2019
489 visualizaciones desde el 29 de Julio del 2019
313,8 KB
4 paginas
Creado hace 7a (28/04/2016)
Excepciones
1/7
Excepciones
A menudo, en los programas se producen situaciones
excepcionales o inesperadas.
Esto es frecuente en la entrada/salida: el programa pide un
entero y el usuario introduce una cadena de texto que no
representa un entero
// lee de teclado un entero del
// repite la peticion si el entero no está en ese rango
static int pideEntero(string texto, int min, int max){
intervalo [min,max]
int dato = −1;
while (dato<min || dato>max){
Console.Write ("{0} [{1},{2}]: ", texto, min, max);
dato = int.Parse (Console.ReadLine ());
};
return dato;
}
2/7
Si [min, max] = [0, 100] y ponemos -4, solicita de nuevo el dato
Y si introducimos la cadena doce?
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Si escribimos doce int.Parse("doce") produce un error.
Unhandled Exception:
System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber (System.String str, NumberStyles options, ...
at System.Number.ParseInt32 (System.String s, NumberStyles style, ...
at System.Int32.Parse (System.String s) ...
at excepciones.MainClass.pideEntero (System.String texto, ...
at excepciones.MainClass.Main () [0x0000c] in .../excepciones/Program.cs:13
[ERROR] FATAL UNHANDLED EXCEPTION: System.FormatException: Input string was not in a correct format.
int.Parse no sabe cómo convertir el string "doce" al tipo
int lanza una excepción, i.e., informa de que ha ocurrido
una circunstancia excepcional.
... y además el programa termina abruptamente
... pero las excepciones pueden capturarse y retomar el control
de la situación
3/7
La construcción try-catch
Rehacemos el código:
static int pideEntero2(string texto, int min, int max){
int dato = −1;
while (dato<min || dato>max){
Console.Write ("{0} [{1},{2}]: ", texto, min, max);
try { // intentamos la conversion
dato = int.Parse (Console.ReadLine ());
}
catch { // si algo no va bien
Console.WriteLine("Debes introducir un valor entero");
}
}
}
return dato;
Esto se denomina a veces control dinámico de errores y está
relacionado con la programación defensiva.
4/7
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM En el bloques try se pueden escribir tantas instrucciones
como se quiera: se capturará cualquier excepción producida
por ellas en.
En el bloque catch también pueden escribirse tantas
instrucciones como se desee y se ejecutarán en caso de
excepción.
Se pueden anidar los try-catch
try
{
{ ... }
try
{
// Las excepciones de este bloque se capturan el catch externo
// Las excepciones de este bloque se capturan el catch interno
}
catch // excepciones internas
{ ... }
// Las excepciones de este bloque se capturan el catch externo
}
catch // excepciones externas
5/7
Refinando el catch
El catch puede capturar el tipo de excepción que se produce (en
realidad una excepción es un o objeto de la clase Exception).
Esto permite obtener más información sobre la excepción
(sin detener el programa)
static int pideEntero3(string texto, int min, int max){
int dato = −1;
while (dato<min || dato>max){
Console.Write ("{0} [{1},{2}]: ", texto, min, max);
try {
dato = int.Parse (Console.ReadLine ());
}
catch (Exception e){
Console.WriteLine (e);
Console.WriteLine("Debes introducir un valor entero");
}
}
return dato;
}
6/7
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Creando nuestras propias excepciones
El programador también puede lanzar excepciones de la forma:
throw new Exception("Algo va muy mal");
Esta excepción puede capturarse y manejarse como las
anteriores con try-catch.
Las excepciones deben utilizarse en situaciones críticas,
cuando el programa no puede continuar normalmente: no
deben lanzarse en situaciones que puedan solucionarse
fácilmente pidiendo otro valor o dando un simple mensaje
de error.
7/7
Jaime Sánchez. Sistemas Informáticos y Computación, UCM
Comentarios de: Excepciones (0)
No hay comentarios