try catch error-handling try-catch pascal

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)

  1. Creo que uno puede usar READ para una variable de tipo char, y guardar al usuario para escribir enter.

  2. 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:

  1. legibilidad. ¿Qué es 48?

  2. exactitud. Si está compilado en un sistema que no es ASCII, 48 puede no ser el código de carácter para 0.

Stan