Ejercicio: Inicio y detección de excepciones en una aplicación de consola de C#
En este ejercicio, desarrollará un bloque de código try y una cláusula catch en las instrucciones de nivel superior, creará e iniciará excepciones en el método MakeChange y, luego, completará el bloque de código catch mediante un objeto de excepción. Durante este ejercicio se realizarán las tareas siguientes:
- Actualizar instrucciones de nivel superior: implemente un patrón
try-catchen las instrucciones de nivel superior. El bloque de códigotrycontendrá la llamada aMakeChange. - Actualizar el método
MakeChange: cree e inicie excepciones para problemas de "Insuficiente hasta" y "Pago insuficiente". - Actualice el bloque de código
catchpara usar las propiedades de la excepción iniciada. - Prueba de comprobación: realice pruebas de comprobación del código que desarrolle en este ejercicio.
Agregar un patrón try-catch a las instrucciones de nivel superior
En esta tarea, encerrará la llamada al método MakeChange dentro de una instrucción try y creará la cláusula catch correspondiente.
Asegúrese de que el archivo Program.cs esté abierto en el Editor de Visual Studio Code.
Busque las siguientes líneas de código:
// MakeChange manages the transaction and updates the till string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); // Backup Calculation - each transaction adds current "itemCost" to the till if (transactionMessage == "transaction succeeded") { Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; } else { Console.WriteLine($"Transaction unsuccessful: {transactionMessage}"); }Deténgase un minuto a considerar la finalidad de este código.
Observe que
MakeChangedevuelve un valor de cadena. El valor devuelto se asigna a una variable llamadatransactionMessage. SitransactionMessagees igual a "transacción correcta", el costo del artículo comprado se agrega aregisterCheckTillTotal. La variableregisterCheckTillTotalse usa para comprobar el balance de caja calculado por el métodoMakeChange.Para incluir la llamada al método
MakeChangeen un bloque de código de instruccióntry, actualice el código de la siguiente manera:try { // MakeChange manages the transaction and updates the till string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); }Agregue la cláusula
catchsiguiente después del bloque de código de instruccióntry:catch { }Cuando haya creado e iniciado las excepciones, finalizará el desarrollo de la cláusula
catch.
Creación e inicio de excepciones en el método MakeChange
En esta tarea, actualizará MakeChange para crear y generar excepciones personalizadas cuando no se pueda completar una transacción.
El método MakeChange incluye dos problemas que deben dar lugar a excepciones:
Problema de pago insuficiente: este problema se produce cuando el cliente ofrece un pago menor que el costo del artículo. Si el cliente no ha ofrecido un pago suficiente,
MakeChangedebe iniciar una excepción.Problema de caja insuficiente: este problema se produce cuando la caja no contiene los billetes necesarios para producir el cambio exacto. Si la caja no puede realizar el cambio exacto,
MakeChangedebería iniciar una excepción.
Desplácese hacia abajo hasta el método
MakeChange.Busque las siguientes líneas de código:
if (changeNeeded < 0) transactionMessage = "Not enough money provided.";Deténgase un minuto a considerar el problema que este código soluciona.
Si
changeNeededes menor que cero, significa que el cliente no ha proporcionado suficiente dinero para cubrir el precio de compra del artículo que va a adquirir. El precio de compra y el dinero proporcionado por el cliente son parámetros del métodoMakeChange. El método no puede completar la transacción cuando el cliente no proporciona suficiente dinero. En otras palabras, se produce un error en la operación.Hay dos tipos de excepción que parecen coincidir con estas condiciones:
-
InvalidOperationException: una excepciónInvalidOperationExceptionsolo se debe iniciar cuando las condiciones de funcionamiento de un método no admitan la finalización correcta de una llamada de método determinada. En este caso, los parámetros proporcionados al método establecen las condiciones de funcionamiento. -
ArgumentOutOfRangeException: una excepciónArgumentOutOfRangeExceptionsolo se debe iniciar cuando el valor de un argumento está fuera del intervalo de valores permitido definido por el método invocado. En este caso, el dinero proporcionado debe ser mayor que el costo del artículo.
Cualquier tipo de excepción podría funcionar, pero
InvalidOperationExceptiones una coincidencia ligeramente mejor en el contexto de esta aplicación.-
Actualice el código de la siguiente manera:
if (changeNeeded < 0) throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");Desplácese hacia abajo para buscar las siguientes líneas de código:
if (changeNeeded > 0) transactionMessage = "Can't make change. Do you have anything smaller?";Deténgase un minuto a considerar el problema que este código soluciona.
Si
changeNeededes mayor que cero después de los bucleswhileque preparan el cambio, es que la caja se ha quedado sin billetes con los que dar el cambio. El método no puede completar la transacción cuando la caja no tiene los billetes necesarios para dar el cambio. En otras palabras, se produce un error en la operación.La excepción
InvalidOperationExceptionse debe usar para crear la excepción.Actualice el código de la siguiente manera:
if (changeNeeded > 0) throw new InvalidOperationException("InvalidOperationException: The till is unable to make the correct change.");
Completar el bloque de código catch
En esta tarea, actualizará la cláusula catch para detectar un tipo de excepción específico.
Desplácese hacia arriba por encima del método
MakeChangey busque el código siguiente:catch { }Para detectar el tipo de excepción iniciada en el método
MakeChange, actualice el código de la siguiente manera:catch (InvalidOperationException e) { Console.WriteLine($"Could not complete transaction: {e.Message}"); }El objeto de excepción
InvalidOperationExceptionque se inicia enMakeChangese detectará, pero no así otros tipos de excepción. Puesto que no está preparado para controlar otros tipos de excepción, es importante dejar que se detecten más abajo en la pila de llamadas. Si sabe que se esperan otros tipos de excepción dentro deMakeChange, puede agregar más cláusulascatch.Use el menú Archivo para guardar las actualizaciones.
Convertir el método MakeChange de "string" a "void" y acceder a las propiedades de excepción
En esta tarea, actualizará MakeChange para que sea de tipo void y, luego, usará las propiedades de excepción para comunicar los detalles del problema al usuario.
Desplácese a la parte superior del método
MakeChange.Para convertir el método
MakeChangedel tipostringal tipovoid, actualice el código de la siguiente manera:static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)Elimine la siguiente declaración de variable:
string transactionMessage = "";Desplácese hasta la parte inferior del método
MakeChange.Elimine las líneas de código siguientes:
if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage;Desplácese hasta las instrucciones de nivel superior y busque el bloque de código
try.Actualice el bloque de código
tryde la siguiente manera:try { // MakeChange manages the transaction and updates the till MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes); Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; }Busque y elimine las líneas de código siguientes:
// Backup Calculation - each transaction adds current "itemCost" to the till if (transactionMessage == "transaction succeeded") { Console.WriteLine($"Transaction successfully completed."); registerCheckTillTotal += itemCost; } else { Console.WriteLine($"Transaction unsuccessful: {transactionMessage}"); }Los bloques de código
tryycatchahora comunican al usuario los mensajes de "éxito" y "error" de la transacción. Dado que la propiedadMessagede la excepción describe el problema, una única instrucciónConsole.WriteLine()soluciona ambos problemas. Después de estas actualizaciones, el código es más fácil de leer y mantener.Use el menú Archivo para guardar las actualizaciones.
Comprobar el trabajo
En esta tarea, ejecutará la aplicación y comprobará que el código actualizado funciona según lo previsto.
Desplácese hacia arriba para encontrar el bucle
whileen las instrucciones de nivel superior.Este bucle se usa para recorrer en iteración las transacciones.
Busque el código siguiente unas líneas antes del inicio del bucle
while.int transactions = 10;Actualice el número de transacciones a
40de la forma siguiente:int transactions = 40;Busque la siguiente línea de código dentro del bucle
while.int itemCost = valueGenerator.Next(2, 20);Actualice el generador de números aleatorios
itemCostde la siguiente manera:int itemCost = valueGenerator.Next(2, 50);Este intervalo de costos coincide mejor con los artículos que los clientes van a comprar.
Use el menú Archivo para guardar las actualizaciones.
En el menú Ejecutar, seleccione Iniciar depuración.
Revise la salida en el panel TERMINAL.
Compruebe que se muestran los mensajes asociados a los dos tipos de excepción:
El informe de transacciones debe incluir los siguientes mensajes "No se pudo completar la transacción":
Customer is making a $42 purchase Using 2 twenty dollar bills Using 0 ten dollar bills Using 0 five dollar bills Using 0 one dollar bills Could not complete transaction: InvalidOperationException: Not enough money provided to complete the transaction.Customer is making a $23 purchase Using 2 twenty dollar bills Using 0 ten dollar bills Using 0 five dollar bills Using 1 one dollar bills Cashier prepares the following change: A five A five A one A one Could not complete transaction: InvalidOperationException: The till is unable to make change for the cash provided.
Enhorabuena, ha depurado la aplicación de caja registradora para corregir un problema con la lógica del código y ha actualizado la aplicación para usar las técnicas de control de excepciones adecuadas.
Nota
La salida notificada muestra que el balance de la caja registradora ya no es correcto. Hay errores de lógica adicionales en el código. Si está interesado en poner a prueba sus conocimientos sobre la depuración en Visual Studio Code, hay un módulo de proyectos de desafío.