1
resposta

Duas ArgumentException

Nesse exercício, somos recomendados a criar uma ArgumentException que impeça a transferência de valor igual ou menor que 0:

public void Transferir(double valor, ContaCorrente contaDestino)
{
    if (valor < 0)
    {
        throw new ArgumentException("Valor inválido para a transferência.", nameof(valor));
    }

    Sacar(valor);

    contaDestino.Depositar(valor);
}

Porém, eu já tinha no meu código a ArgumentException que também impedia que o número da agência ser igual ou menor que 0. Portanto, meu código em ContaCorrent.cs ficou assim: (omiti partes do código que creio serem irrelevantes para a dúvida)

public ContaCorrente(int numero_agencia, string numero_conta, double saldo)
        {
            this.numero_agencia = numero_agencia;
            this.Conta = numero_conta;
            this.saldo = saldo;
            if (numero_agencia <= 0)
            {
                throw new ArgumentException("O número da agência deve ser maior que 0", nameof(numero_agencia));
            }

  public bool Transferir(double valor, ContaCorrente destino)
        {
            if (valor >= saldo)
            {
                ContadorTransferenciasNaoPermitidas++;
                throw new SaldoInsuficienteException("Saldo insuficiente para essa transação");
            }
            else if (valor <= 0)
            {
                ContadorTransferenciasNaoPermitidas++;
                throw new ArgumentException("O valor da transferência deve ser maior que 0", nameof(valor));
            }
            else
            {
                Sacar(valor);
                destino.Depositar(valor);
                return true;
            }
        }

E o bloco try-catch-finally no meu program.cs ficou assim:

try
{
    ContaCorrente contaMatheus = new ContaCorrente(42, "1428-7", 238);

    contaMatheus.Sacar(50);
    Console.WriteLine(contaMatheus.GetSaldo());
    contaMatheus.Sacar(10);
    Console.WriteLine(contaMatheus.GetSaldo());

    ContaCorrente contaArthur = new ContaCorrente(34, "2862-7", 300);
    //Console.WriteLine(contaArthur.Transferir(0, contaMatheus));
    Console.WriteLine(contaArthur.Transferir(0, contaMatheus));

}
catch (ArgumentException ex)
{
    //Console.WriteLine(ex.ParamName);
    //Console.WriteLine(ex.StackTrace); // Nos diz de onde vem a exceção, e onde ela foi lançada
    Console.WriteLine("O número da agência deve ser maior que 0");
    Console.WriteLine(ex.Message);
}
catch(SaldoInsuficienteException ex)
{
    Console.WriteLine("Operação negada. Saldo insuficiente!");
    Console.WriteLine(ex.Message);
} 

Portanto, o resultado da compilação foi esse:

Código compilado: 188,
178,
O número da agência deve ser maior que 0
O valor da transferência deve ser maior que 0 (Parameter 'valor')

Notem que a mensagem em ArgumentException ""O número da agência deve ser maior que 0" apareceu, já que essa exceção foi chamada. Sei que eu poderia simplesmente tirar essa mensagem do bloco catch, mas lá vem (finalmente) minha dúvida:

É normal/bom hábito ter essas duas ArgumentException podendo ser chamadas pelo mesmo bloco, já que cada uma delas tem sua Message? Qual seria a melhor forma de lidar com essa situação?

1 resposta

Matheus,

Deixa eu ver se entendi sua pergunta.

Eu acredito que você tem que usar os "ArgumentException" de acordo com todos os problemas que podem surgir no seu código e tratar tudo para que o usuário NUNCA receba um "ABEND" (Abdominal End - Término Anormal de Processamento), uma tela azul ou uma mensagem de erro feia.

É claro que você pode tomar atitudes para NÃO precisar tratar o erro simplesmente limitando o escopo do usuário e NÃO deixando o erro ocorrer, verificando a informação ANTES. Exemplo: Se "O número da agência deve ser maior que 0" Se o usuário digitar "0" no mesmo instante você mostra para o usuário que aquele valor NÃO é aceito, sem gerar erro, e pede para o usuário digitar um valor válido.

Mas existem momentos que NÃO é possível prevenir o erro.

Caso queira se aprofundar no assunto, segue alguns links para o seu deleite:

===============================================================

Usando múltiplas capturas de Exceptions em C#

by lisura • 17/02/2019

O que são Exceptions?

Segundo a documentação da Microsoft:

Uma exceção é qualquer condição de erro ou comportamento inesperado encontrado por um programa em execução. Toda exceção é um objeto herdado da classe System.Exception e é lançada de uma área do código em que ocorreu um problema.

...

http://leandrolisura.com.br/usando-multiplas-capturas-de-exceptions-em-c/

===============================================================

C# - Capturando e tratando Exceptions (revisão)

Neste artigo vamos abordar a captura e o tratamento das exceções (Exceptions) que são mecanismos primários para comunicar condições de erros.

As exceções possuem um grande poder e um grande poder trás também grandes responsabilidades.

Dessa forma não devemos abusar deste recurso mas saber usá-lo com bom senso.

...

https://macoratti.net/13/07/c_excep.htm

===============================================================

Melhor maneira de lidar com Exceptions

...

Eu gosto muito do artigo do Eric Lippert sobre o assunto e vou fazer um resumo aqui.

TipoO que fazerExemplo
FatalNada, a CLR saberá o que fazer melhor que vocêOutOfMemoryException
TrapalhadaConserte o bug que está causando issoArgumentNullException
Ruidoa) Conserte o software/framework mal arquitetado
b) Troque de fornecedor de biblioteca mal arquitetada
c) Aceite o prejuízo e trate como se fosse Estrangeira
EstrangeiraManipule da forma mais adequada possivelFileNotFoundException

https://pt.stackoverflow.com/questions/13303/melhor-maneira-de-lidar-com-exceptions

===============================================================

Vexing exceptions

Posted on September 10, 2008

Writing good error handling code is hard in any language, whether you have exception handling or not. When I’m thinking about what exception handling I need to implement in a given program, I first classify every exception I might catch into one of four buckets which I label fatal, boneheaded, vexing and exogenous.

...

https://ericlippert.com/2008/09/10/vexing-exceptions/

===============================================================

[]'s,

Fabio I.