Error creating a Custom Exception

Asked

Viewed 134 times

0

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:

inserir a descrição da imagem aqui

  • "when compiling gives error", you must be trying to run the program, not compile... and running, it gives error because the code of the program is generating the exception... other than that, it seems to me that you are trying to use Exception the wrong way, for a wrong goal... could even consider this an xy problem: https://en.meta.stackoverflow.com/a/1202/69359

2 answers

3

You must be running the program, not just compiling. When running the program and typing 0, the exception shown as an exception not dealt with by the visual studio debug is generated.

As I commented it seems to me that you are trying to use exception in the wrong way, that 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.");
     }
}

Put in the .Netfiddle

But if you want to use Exception (for teaching 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 in the .Netfiddle

I recommend reading: /a/97856/69359 and in this answer has references to other.


Edit:

Back 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 the MinhaExceptionDivisaoPorZero, but when trying to divide by zero, a DivideByZeroException and this, is not a MinhaExceptionDivisaoPorZero (despite the fact that all MinhaExceptionDivisaoPorZero will be a DivideByZeroException) soon will not fall into the Exception you expect. For this, 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 don’t see how you can apply what you’re looking for ValorMuitoBaixoException does not make sense for a division calculation.

I recommend again reading the link above.

  • 1

    My goal is to create a personalized exception. an Exception created by me with the name Valormuitobaixoexception and that this Exception receives a message and shows in a text box for example.

  • @Daniellearrudatorres understood the problem ?

  • @Daniellearrudatorres The exception you have created, what you are not doing is treating it. Read Rovann’s response carefully, especially by observing the catch{}

1


You’re not treating the mistake, just throwing a throw

throw new ValorMuitoBaixoException( "Erro personalizado")

Do it:

                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.";
                       }
                   }
               }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.