Error creating a Custom Exception

1

I'm trying to simulate a custom exception, but when compiling I get an error.

  using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExerciciosTratamentoErros
{
    class Program
    {
        static void Main(string[] args)
        {
            int numero;

            Console.WriteLine("informe ate que numero devemos contar");
            numero = Convert.ToInt16(Console.ReadLine());


                try
                {
                    numero = 5 / numero; // coloco 0 (zero) para entrar no CATCH
                }
                catch
                {
                    throw new ValorMuitoBaixoException( "Erro personalizado");
                }


        }
    }
}

Custom Exception Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace ExerciciosTratamentoErros
{
    class ValorMuitoBaixoException: Exception
    {
        public ValorMuitoBaixoException(string mensagem)
             : base(mensagem)
        {
        }
    }
}

Error:

    
asked by anonymous 09.07.2018 / 00:30

2 answers

2

You're not handling the error, just throwing a throw

throw new ValorMuitoBaixoException( "Erro personalizado")

Do this:

                try
                {
                    numero = 5 / numero; // coloco 0 (zero) para entrar no CATCH
                }
                catch(Exception e)
                {
                   //Retorna a mensagem de erro tratada para o console
                   Console.WriteLine(Erro.TratamentoException(e));
                }


               public class Erro
               {
                   public string TratamentoException(Exception e)
                   {
                       //Verifica se a exceção é referente a divisão por zero
                       if(e.InnerException is DivideByZeroException)
                       {
                         return "0";
                       }
                       else if(e.InnerException is System.FormatException)
                       {
                         return "Você não informou num número válido";
                       }

                       [...] // Inclua outras verificações

                       else 
                       {
                         return "Valor incorreto.";
                       }
                   }
               }
    
10.07.2018 / 21:29
4

You should be running the program, not just compiling. When you run the program and type 0, the exception shown as an exception not treated by the visual studio debug is generated.

As I said it seems to me that you are trying to use exception in the wrong way, which might even consider an XY problem.

This problem should be solved simply with a IF :

public static void Main()
{
     int numero;
     Console.WriteLine("Informe um número");
     string line =  Console.ReadLine(); 
     //string line  = "0"; //Simula que o usuário digitou 0 na linha do console.
     if (int.TryParse(line,out numero))
     {
         if (numero != 0)
         {
             Console.WriteLine("5 dividido por " +numero+ " é: " + (5/numero));
         }
         else
         {
             Console.WriteLine("Não é possível dividir por 0");
         }
     }
     else
     {
         Console.WriteLine("Valor informado não pode ser convertido para inteiro.");
     }
}

Place in .NETFiddle

But if you want to use Exception (for didactic purposes), this code would look like this:

public static void Main()
{
     int numero;
     Console.WriteLine("Informe um número");
     string line =  Console.ReadLine(); 
     //string line  = "0"; //Simula que o usuário digitou 0 na linha do console.
     if (int.TryParse(line,out numero))
     {
         try
         {
             Console.WriteLine("5 dividido por " +numero+ " é: " + (5/numero));
         }
         catch (DivideByZeroException)
         {
             Console.WriteLine("Tentativa de divisão por 0");
         }
         catch (ArithmeticException)
         {
              Console.WriteLine("Erro Aritimético");
         }
         //... 

     }
     else
     {
         Console.WriteLine("Valor informado não pode ser convertido para inteiro.");
     }
}

I put it in .NETFiddle

  

I recommend reading: link and in this answer you have references to others.

Edit:

Returning to the point of creating your Exception, Consider the following code:

public class Program
{
    public static void Main()
    {
         int numero;
         Console.WriteLine("Informe um número");
         string line =  Console.ReadLine(); 
         //string line  = "0"; //Simula que o usuário digitou 0 na linha do console.
         if (int.TryParse(line,out numero))
         {
             try
             {
                 Console.WriteLine("5 dividido por " +numero+ " é: " + (5/numero));
             }
             catch (MinhaExceptionDivisaoPorZero ex)
             {
                 Console.WriteLine(ex.Message);
             }
             catch (DivideByZeroException)
             {
                 Console.WriteLine("Tentativa de divisão por 0");
             }
             catch (ArithmeticException)
             {
                  Console.WriteLine("Erro Aritimético");
             }
             //... 

         }
         else
         {
             Console.WriteLine("Valor informado não pode ser convertido para inteiro.");
         }
    }

}

public class MinhaExceptionDivisaoPorZero : DivideByZeroException
{
    public MinhaExceptionDivisaoPorZero() : base("Você tentou dividir por zero")
    {

    }
}

This code creates MinhaExceptionDivisaoPorZero , but when trying to divide by zero, a DivideByZeroException is generated and this is not a MinhaExceptionDivisaoPorZero (although all MinhaExceptionDivisaoPorZero will be DivideByZeroException ) will not soon fall into the Exception you expect. For this, it should have a code like this (which in turn, will be absurdly bad):

///Perdoai o código abaixo. Amém
public class Program
{
    public static void Main()
    {
         int numero;
         Console.WriteLine("Informe um número");
         //string line =  Console.ReadLine(); 
         string line  = "0"; //Simula que o usuário digitou 0 na linha do console.
         if (int.TryParse(line,out numero))
         {
             try
             {

                if (numero != 0)
                {
                     Console.WriteLine("5 dividido por " +numero+ " é: " + (5/numero));
                }
                else
                {
                     throw new MinhaExceptionDivisaoPorZero(); //Você vai ter que gerar uma exceção
                }
             }
             catch (MinhaExceptionDivisaoPorZero ex)
             {
                 Console.WriteLine(ex.Message); //pra mostrar a mensagem dela. Não é mais fácil só mostrar a mensagem lá em cima ?
             }

         }
         else
         {
             Console.WriteLine("Valor informado não pode ser convertido para inteiro.");
         }
    }
}

public class MinhaExceptionDivisaoPorZero : DivideByZeroException
{
    public MinhaExceptionDivisaoPorZero() : base("Você tentou dividir por zero")
    {

    }
}

So I do not see how to apply what you're wanting, other than the detail that ValorMuitoBaixoException does not make sense for a division calculation.

  

I recommend again reading the answer above.

    
09.07.2018 / 01:07