error handling - catch - Prueba y atrapa en Pascal
on except delphi (3)
Estoy usando Dev-Pas 1.9.2 y estoy tratando de asegurarme de que el programa no se cuelgue cuando se ingresa un símbolo o un valor de letra.
Busqué en Google y en Google y no encuentro ningún resorcio sobre cómo lograr esto.
Cualquier ayuda es muy apreciada. ¡Gracias!
Aquí está el código que estoy tratando de administrar la entrada:
Function GetMenuChoice : Integer;
Var
OptionChosen : Integer;
Begin
Write(''Please enter your choice: '');
Readln(OptionChosen);
If (OptionChosen < 1) Or ((OptionChosen > 4) And (OptionChosen <> 9))
Then
Begin
Writeln;
Writeln(''That was not one of the allowed options. Please try again: '');
End;
GetMenuChoice := OptionChosen;
End;
(además de Ken White''s)
Creo que uno puede usar READ para una variable de tipo char, y guardar al usuario para escribir enter.
Pero iría por una versión de mecanografía y usaría VAL.
- Es algo más que codifica el agnóstico, y
- el principio se extiende más allá del valor 9.
- Sin embargo, requiere una entrada, y la entrada pesada arruinará su pantalla.
Para este último hay otros métodos (por ejemplo, el uso de la unidad de Crt o Video), pero que probablemente va más allá del alcance de la tarea
Cambie su código para aceptar un Char en su lugar; si necesita un número entero por algún motivo, gestione la conversión posteriormente.
Esto funciona en Delphi; a menos que no pueda usar conjuntos como [''1''..''4'',''9'']
y establecer operadores, debería funcionar bien.
Function GetMenuChoice : Char;
Var
OptionChosen : Char;
Begin
repeat
Write(''Please enter your choice: '');
Readln(OptionChosen);
If not (OptionChosen in [''1''..''4'', ''9''])
Then
Begin
Writeln;
Writeln(''That was not one of the allowed options. Please try again: '');
End;
until OptionChosen in [''1''..''4'', ''9''];
GetMenuChoice := OptionChosen;
End;
Si necesita que se devuelva un número, cambie el tipo de devolución a entero (o byte) y luego cambie la línea final a:
GetMenuChoice := Ord(OptionChosen) - 48;
o
GetMenuChoice := Ord(OptionChosen) - Ord(''0'');
¿De verdad quieres aceptar exactamente cuatro entradas posibles diferentes? (Los números 1, 2, 3, 4 y 9) Eso es lo que estás pidiendo en este momento.
Nota: incluso con un cambio como el primer contestador sugerido, su código tiene un problema importante. ¿Qué sucede si se da un 5 o una Q ... te quejas, Y LUEGO SALIAS DE LA RUTINA.
En el código original, si ingreso un 100, imprimirá "Eso no estaba permitido" ... y luego devolverá 100 a la persona que llama.
Sugerencia: loop.
Sugerencia 2: asegúrese de no repetir el ciclo para siempre
Por cierto, NUNCA lo haga: ord (some character) - 48
cambio, siempre use: ord (some character) - ord (''0'')
¿Por qué? Dos razones obvias:
legibilidad. ¿Qué es 48?
exactitud. Si está compilado en un sistema que no es ASCII, 48 puede no ser el código de carácter para 0.
Stan