2
respostas

Tratamento de erro de Objeto x Try-Catch

Olá PessoALL,

Por favor, tenho a seguinte dúvida:

Programei dentro da classe "Program" o método "Main()" desta forma:

static void Main()
{
    try
    {
        TesteObjeto();
    }
    catch (Exception)
    {
        Console.WriteLine("Catch no método MAIN");
    }
    finally
    {
        Console.ReadKey();
    }
}

Para testar o tipo "object", dentro da classe "Program" escrevi a função estática "TesteObjeto()", desta forma (detalhe: já existem as classes "ContaCorrente()" e "Cliente()") :

private static void TesteObjeto()
{
    object conta = new ContaCorrente(456, 687876);

    Cliente carlos_1 = new()
    {
        Nome = "Carlos",
        CPF = "458.623.120-03",
        Profissao = "Designer"
    };

    Cliente carlos_2 = new()
    {
        Nome = "Carlos",
        CPF = "458.623.120-03",
        Profissao = "Designer"
    };

    //if (carlos_1 == carlos_2)
    //if (ReferenceEquals(carlos_1, carlos_2))
    //if (carlos_1.Equals(carlos_2))

    // Estou passando o objeto ERRADO propositalmente aqui:
    if (carlos_1.Equals(conta))
        Console.WriteLine("São iguais");
    else
        Console.WriteLine("NÃO São iguais");
}

Até aqui tudo certo. Fiz um "override" dentro da minha classe "cliente" desta forma:

  • (1) - PRIMEIRO TESTE
public override bool Equals(object obj)
{
    // Conversão Explícita
    Cliente outroCliente = (Cliente)obj;

    return CPF == outroCliente.CPF;
}
  • (2) - SEGUNDO TESTE
public override bool Equals(object obj)
{
    Cliente outroCliente = obj as Cliente;

    // (*2) Aqui ocorre a exceção "System.NullReferenceException" e NÃO devolve para o "Main()".
    return CPF == outroCliente.CPF;
}
  • No PRIMEIRO TESTE o erro ao receber um objeto "conta" cai no tratamento "catch" e mostra a mensagem: "Catch no método MAIN".

  • No SEGUNDO TESTE o programa NÃO devolve para a "Main()" tratar o erro, apresentando a exceção dentro da própria classe "cliente"...

Pergunta:

  • Por que no SEGUNDO TESTE a exceção não é devolvida e tratada no método MAIN()?

Obrigado,

Fabio Ingenito.

2 respostas

Bom dia, o operador AS, ao contrário do expressão de conversão, não dispara uma exceçã, mas retorna um null quando a conversão não é possível:

"The as operator is used to explicitly convert a value to a given reference type or nullable value type. Unlike a cast expression (§11.8.7), the as operator never throws an exception. Instead, if the indicated conversion is not possible, the resulting value is null."

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#111112-the-as-operator

Diogo,

Em ambos os casos, a exceção NÃO foi na "AS", mas na linha:

return CPF == outroCliente.CPF;

Experimente colocar o código dentro do Visual Studio e veja.

Fabio I.