1
resposta

Dúvida sobre THROW

Olá, tentei executar o código abaixo mas ele deu System.DivideByZeroException: 'Tentativa de divisão por zero.' no THROW. Meu objetivo com esse código era imprimir a linha "Linha executada no MAIN depois do erro", para eu entender o fluxo do programa mesmo quando algum erro acontece. Por que não consigo? Devo ter tratamento do erro no método TestaDivisao() e também no Main() ?

namespace ByteBank
{
    class Program
    {
        static void Main(string[] args)
        {
            Metodo();        
            Console.WriteLine("Linha executada no MAIN depois do erro");
            Console.ReadLine();
        }

        public static int Dividir(int numero, int divisor)
        {
            return numero / divisor;
        }

        static void Metodo()
        {
            TestaDivisao(0);
        }

        static void TestaDivisao(int divisor)
        {
            try
            {
                Dividir(10, divisor);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw;  //O erro acontece NESSA linha
            }
        }
    }
}
1 resposta

Olá Rodolfo, não é necessário tratar o erro no método e no main, basta tratar em um dos metodos da pilha de chamadas porém no caso do seu código ela não está sendo tratada em momento algum. Quando você usa o try\catch você indica que pode haver uma exceção e caso ela ocorra você pode tratar no bloco catch ou propagar para o próximo método da pilha de chamadas, da forma que você fez você está propagando essa exceção usando o throw, contudo nenhum outro método da pilha de chamadas possui um tratamento try/catch por isso o erro está ocorrendo. para solucionar seu problema e exibir o resultado esperado , basta retirar o comando throw, dessa forma o tratamento será feito dentro do Catch e a execução da aplicação prosseguirá normalmente.

static void TestaDivisao(int divisor)
        {
            try
            {
                Dividir(10, divisor);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                // throw; este comando deve ser removido para que a exceção seja efetivamente
            // tratada ao invés de propagar para a pilha de chamadas             
            }
        }