Exercício - Lançar e capturar exceções em um aplicativo de console C#
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:
- Atualizar instruções de nível superior: implemente um
try-catchpadrão nas instruções de nível superior. Otrybloco de código conterá a chamada paraMakeChange. - Método de atualização
MakeChange: crie e lance exceções para problemas de "Insuficiente até" e "Pagamento insuficiente". - Atualize o
catchbloco de código para usar as propriedades da exceção lançada. - 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 .
Verifique se o arquivo Program.cs está aberto no Editor de Códigos do Visual Studio.
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}"); }Reserve um minuto para considerar o propósito deste código.
Observe que
MakeChangeretorna um valor de cadeia de caracteres. O valor de retorno é atribuído a uma variável chamadatransactionMessage. SetransactionMessagefor igual a "transação bem-sucedida", o custo do item comprado é adicionado aoregisterCheckTillTotal. A variávelregisterCheckTillTotalé usada para verificar o saldo de till calculado peloMakeChangemétodo.Para incluir a chamada para o
MakeChangemétodo em um bloco de código detryinstruçã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); }Adicione a seguinte
catchcláusula após o bloco de código datryinstrução:catch { }Você terminará de desenvolver a
catchclá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,
MakeChangedeve 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,
MakeChangedeve lançar e exceção.
Desloque o ecrã para baixo até encontrar o método
MakeChange.Localize as seguintes linhas de código:
if (changeNeeded < 0) transactionMessage = "Not enough money provided.";Reserve um minuto para considerar o problema que este código está abordando.
Se
changeNeededfor 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 doMakeChangemé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: UmaInvalidOperationExceptionexceçã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- UmaArgumentOutOfRangeExceptionexceçã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.-
Atualize o código da seguinte forma:
if (changeNeeded < 0) throw new InvalidOperationException("InvalidOperationException: Not enough money provided to complete the transaction.");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?";Reserve um minuto para considerar o problema que este código está abordando.
Se
changeNeededfor maior que zero após oswhileloops 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
InvalidOperationExceptionexceção deve ser usada para criar a exceção.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.
Role para cima acima do
MakeChangemétodo e localize o seguinte código:catch { }Para capturar o tipo de exceção lançado no
MakeChangemétodo, atualize o código da seguinte maneira:catch (InvalidOperationException e) { Console.WriteLine($"Could not complete transaction: {e.Message}"); }O
InvalidOperationExceptionobjeto de exceção lançadoMakeChangeserá 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 noMakeChange, poderá adicionar cláusulas adicionaiscatch.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.
Role até a parte superior do
MakeChangemétodo.Para converter o
MakeChangemétodo de tipostringpara tipovoid, 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)Exclua a seguinte declaração de variável:
string transactionMessage = "";Desloque-se para a parte inferior do
MakeChangemétodo.Exclua as seguintes linhas de código:
if (transactionMessage == "") transactionMessage = "transaction succeeded"; return transactionMessage;Role para cima até as instruções de nível superior e localize o bloco de
trycódigo.Atualize o bloco de
trycó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; }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
tryblocos de código ecatchagora estão comunicando as mensagens de "sucesso" e "falha" da transação para o usuário. Como a propriedade daMessageexceção descreve o problema, uma únicaConsole.WriteLine()instrução aborda ambos os problemas. Seu código é mais fácil de ler e manter após essas atualizações.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.
Role para cima para encontrar o
whileloop nas instruções de nível superior.Esse loop é usado para iterar através das transações.
Localize o código a seguir algumas linhas antes do início do
whileloop.int transactions = 10;Atualize o número de transações da
40seguinte forma:int transactions = 40;Localize a seguinte linha de código dentro do
whileloop.int itemCost = valueGenerator.Next(2, 20);Atualize o gerador de
itemCostnú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.
Use o menu Arquivo para salvar suas atualizações.
No menu Executar, selecione Iniciar Depuração.
Analise a saída no painel TERMINAL.
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!