Exercício - Lançar e capturar exceções em um aplicativo de console C#

Concluído

Neste exercício, você desenvolverá um bloco de código e try uma catch cláusula nas instruções de nível superior, criará e lançará exceções no método e, em MakeChange seguida, completará o catch bloco de código usando um objeto de exceção. Conclua as seguintes tarefas durante este exercício:

  1. Atualizar instruções de nível superior: implemente um try-catch padrão nas instruções de nível superior. O try bloco de código conterá a chamada para MakeChange.
  2. Método de atualização MakeChange : crie e lance exceções para problemas de "Insuficiente até" e "Pagamento insuficiente".
  3. Atualize o catch bloco de código para usar as propriedades da exceção lançada.
  4. Teste de verificação: execute testes de verificação para o código que você desenvolve neste exercício.

Adicionar um try-catch padrão às instruções de nível superior

Nesta tarefa, você colocará a chamada no MakeChange método dentro de uma try instrução e criará a cláusula correspondente catch .

  1. Verifique se o arquivo Program.cs está aberto no Editor de Códigos do Visual Studio.

  2. Localize as seguintes linhas 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}");
    }
    
  3. Reserve um minuto para considerar o propósito deste código.

    Observe que MakeChange retorna um valor de cadeia de caracteres. O valor de retorno é atribuído a uma variável chamada transactionMessage. Se transactionMessage for igual a "transação bem-sucedida", o custo do item comprado é adicionado ao registerCheckTillTotal. A variável registerCheckTillTotal é usada para verificar o saldo de till calculado pelo MakeChange método.

  4. Para incluir a chamada para o MakeChange método em um bloco de código de try instrução, atualize seu código da seguinte maneira:

    try
    {
        // MakeChange manages the transaction and updates the till 
        string transactionMessage = MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    }
    
  5. Adicione a seguinte catch cláusula após o bloco de código da try instrução:

    catch
    {
    }
    

    Você terminará de desenvolver a catch cláusula depois de criar e lançar as exceções.

Criar e lançar exceções no MakeChange método

Nesta tarefa, você atualizará MakeChange para criar e lançar exceções personalizadas quando uma transação não puder ser concluída.

O MakeChange método inclui dois problemas que devem resultar em exceções:

  • Problema de falta de pagamento: esse problema ocorre quando o cliente oferece um pagamento menor do que o custo do item. Se o cliente não ofereceu pagamento suficiente, MakeChange deve abrir uma exceção.

  • Problema de caixa insuficiente: esse problema ocorre quando o caixa não contém as contas necessárias para produzir a alteração exata. Se o caixa não pode fazer a mudança exata, MakeChange deve lançar e exceção.

  1. Desloque o ecrã para baixo até encontrar o método MakeChange.

  2. Localize as seguintes linhas de código:

    if (changeNeeded < 0)
        transactionMessage = "Not enough money provided.";
    
  3. Reserve um minuto para considerar o problema que este código está abordando.

    Se changeNeeded for inferior a zero, o cliente não forneceu dinheiro suficiente para cobrir o preço de compra do item que está comprando. O preço de compra e o dinheiro fornecido pelo cliente são parâmetros do MakeChange método. O método não consegue concluir a transação quando o cliente não fornece dinheiro suficiente. Em outras palavras, a operação falha.

    Há dois tipos de exceção que parecem corresponder a essas condições:

    • InvalidOperationException: Uma InvalidOperationException exceção só deve ser lançada quando as condições operacionais de um método não suportam a conclusão bem-sucedida de uma chamada de método específica. Neste caso, as condições de funcionamento são estabelecidas pelos parâmetros fornecidos ao método.
    • ArgumentOutOfRangeException - Uma ArgumentOutOfRangeException exceção só deve ser lançada quando o valor de um argumento estiver fora do intervalo permitido de valores, conforme definido pelo método invocado. Neste caso, o dinheiro fornecido deve ser maior do que o custo do item.

    Qualquer tipo de exceção pode funcionar, mas InvalidOperationException é uma correspondência ligeiramente melhor no contexto deste aplicativo.

  4. Atualize o código da seguinte forma:

    if (changeNeeded < 0)
        throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");
    
  5. Desloque-se para baixo para localizar as seguintes linhas de código:

    if (changeNeeded > 0)
        transactionMessage = "Can't make change. Do you have anything smaller?";
    
  6. Reserve um minuto para considerar o problema que este código está abordando.

    Se changeNeeded for maior que zero após os while loops que preparam a mudança, então o caixa ficou sem contas que podem ser usadas para fazer a alteração. O método é incapaz de concluir a transação quando o caixa não tem as contas necessárias para fazer a alteração. Em outras palavras, a operação falha.

    A InvalidOperationException exceção deve ser usada para criar a exceção.

  7. Atualize o código da seguinte forma:

    if (changeNeeded > 0)
        throw new InvalidOperationException("InvalidOperationException: The till is unable to make the correct change.");
    

Preencha o bloco de catch código

Nesta tarefa, você atualizará a catch cláusula para capturar um tipo de exceção específico.

  1. Role para cima acima do MakeChange método e localize o seguinte código:

    catch
    {
    }    
    
  2. Para capturar o tipo de exceção lançado no MakeChange método, atualize o código da seguinte maneira:

    catch (InvalidOperationException e)
    {
        Console.WriteLine($"Could not complete transaction: {e.Message}");
    }    
    

    O InvalidOperationException objeto de exceção lançado MakeChange será capturado, mas outros tipos de exceção não. Como você não está preparado para lidar com outros tipos de exceção, é importante deixá-los serem capturados mais abaixo na pilha de chamadas. Se você perceber que outros tipos de exceção são esperados no MakeChange, poderá adicionar cláusulas adicionais catch .

  3. Use o menu Arquivo para salvar suas atualizações.

Converter o método MakeChange de "string" para "void" e acessar propriedades de exceção

Nesta tarefa, você atualizará MakeChange para ser do tipo voide, em seguida, usará as propriedades de exceção para comunicar os detalhes do problema ao usuário.

  1. Role até a parte superior do MakeChange método.

  2. Para converter o MakeChange método de tipo string para tipo void, atualize o código da seguinte maneira:

    static void MakeChange(int cost, int[] cashTill, int twenties, int tens = 0, int fives = 0, int ones = 0)
    
  3. Exclua a seguinte declaração de variável:

    string transactionMessage = "";
    
  4. Desloque-se para a parte inferior do MakeChange método.

  5. Exclua as seguintes linhas de código:

    if (transactionMessage == "")
        transactionMessage = "transaction succeeded";
    
    return transactionMessage;
    
  6. Role para cima até as instruções de nível superior e localize o bloco de try código.

  7. Atualize o bloco de try código da seguinte maneira:

    try
    {
        // MakeChange manages the transaction and updates the till 
        MakeChange(itemCost, cashTill, paymentTwenties, paymentTens, paymentFives, paymentOnes);
    
        Console.WriteLine($"Transaction successfully completed.");
        registerCheckTillTotal += itemCost;
    }
    
  8. Localize e exclua as seguintes linhas de código:

    // 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}");
    }
    
    

    Os try blocos de código e catch agora estão comunicando as mensagens de "sucesso" e "falha" da transação para o usuário. Como a propriedade da Message exceção descreve o problema, uma única Console.WriteLine() instrução aborda ambos os problemas. Seu código é mais fácil de ler e manter após essas atualizações.

  9. Use o menu Arquivo para salvar suas atualizações.

Verifique o seu trabalho

Nesta tarefa, você executará seu aplicativo e verificará se o código atualizado funciona como pretendido.

  1. Role para cima para encontrar o while loop nas instruções de nível superior.

    Esse loop é usado para iterar através das transações.

  2. Localize o código a seguir algumas linhas antes do início do while loop.

    int transactions = 10;
    
    
  3. Atualize o número de transações da 40 seguinte forma:

    int transactions = 40;
    
    
  4. Localize a seguinte linha de código dentro do while loop.

    int itemCost = valueGenerator.Next(2, 20);
    
    
  5. Atualize o gerador de itemCost números aleatórios da seguinte maneira:

    int itemCost = valueGenerator.Next(2, 50);
    
    

    Esta faixa de custo é uma melhor combinação para os itens que os clientes irão comprar.

  6. Use o menu Arquivo para salvar suas atualizações.

  7. No menu Executar, selecione Iniciar Depuração.

  8. Analise a saída no painel TERMINAL.

  9. Verifique se as mensagens associadas aos dois tipos de exceção são exibidas:

    O relatório de transações deve incluir as seguintes mensagens "Não foi possível concluir a transação":

    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.
    
    

Parabéns, você depurou o aplicativo de caixa registradora para corrigir um problema de lógica de código e atualizou o aplicativo para usar técnicas adequadas de tratamento de exceções.

Nota

A produção reportada mostra que o dinheiro até já não está equilibrado. Há bugs lógicos adicionais no código. Um módulo de projeto de desafio está disponível se você estiver interessado em demonstrar suas habilidades de depuração de código do Visual Studio!