Tratamento de erro

Nesta aula iremos aprender a utilizar os comandos try, catch, finally, throw e iremos ver um caso real de como e quando utilizar.

assinaturaAssine nossa Comunidade

Aplicação Windows -Tratamento de Erro

Tratamento de erro significa encapsular um bloco de código onde pode ocorrer erro.

Dessa forma evitamos que esse possível erro seja mostrado para o usuário e consequentemente, evitamos também que o sistema não feche de maneira inesperada.

Existe tratamento de erro em toda linguagem de programação.

No C# utilizamos a classe Exception com o TRY, CATCH, FINALLY e THROW para tratar os erros.

Temos como identificar ou diferenciar as classes de exceptions. Seguem alguns casos:

  • Se tentarmos converter uma string por um inteiro, o C# mostrará um erro que não pode converter esse item;
  • Se tentarmos conectar em um Banco de dados que está fora do ar, o C# mostrará uma outra exception;
  • Se tentarmos fazer um request e e mesmo retornar uma falha, o C# mostrará outra exception.

Try / Catch

Try encapsula o bloco de código que possivelmente dará um erro.

Catch local onde é capturado e feito o tratamento do erro.

Vamos mostrar um exemplo no qual vamos digitar uma letra no txtNumero e tentar fazer a conversão,ocorrerá um erro.

      
        
        // Erro ao atribuir um texto a  uma variável do tipo int.
        
        namespace WindowsFormsApplication  
        {
         public partial class FrmCadastro : Form 
         {
           public FrmCadastro()
           {
             InitializeComponent();
           }
           private void btnCalcular_Click(object sender, EventArgs e)
           {
              try
              {
                int numero = int.Parse(txtNumero.Text);
              }
              catch 
              {
                MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?");
                txtNumero.Focus();
              }
           }
         }
        }
       
    

Se não especificarmos a exception no catch, como mostrado acima, qualquer erro que ocorrer no bloco try, será mostrada a mesma mensagem.

Para que isso não aconteça, podemos declarar a exception especifica no catch, que neste caso é a FormatException.

      
        
        // Erro ao atribuir um texto a  uma variável do tipo int.
        
        namespace WindowsFormsApplication  
        {
         public partial class FrmCadastro : Form 
         {
           public FrmCadastro()
           {
             InitializeComponent();
           }
           private void btnCalcular_Click(object sender, EventArgs e)
           {
              try
              {
                int numero = int.Parse(txtNumero.Text);
              }
              catch(FormatException errFormat)
              {
                MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
                txtNumero.Focus();
              }

              catch(Exception err)
              {
                MessageBox.Show("Olá cliente, Esse é um erro genérico?" + err + ")");
                txtNumero.Focus();
              }

           }

         }
        }
       
    

Throw

Throw lança uma nova Exception que nós podemos criar.No exemplo, criaremos um throw com a mensagem "Erro de Propósito", que, quando o sistema executar esta linha, irá para o catch Exception e não para o FormatException.

     
       
       // A mensagem Erro de Propósito irá para o catch Exception
       
       namespace WindowsFormsApplication  
       {
        public partial class FrmCadastro : Form 
        {
          public FrmCadastro()
          {
            InitializeComponent();
          }
          private void btnCalcular_Click(object sender, EventArgs e)
          {
             try
             {
               int numero = int.Parse(txtNumero.Text);

               throw new Exception ("Erro de Proposito")
             }
             catch(FormatException errFormat)
             {
               MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
               txtNumero.Focus();
             }
             catch(Exception err)
             {
               MessageBox.Show("Olá cliente, Aqui será mostrado o Erro de Exception " + err + ")");
               txtNumero.Focus();
             }
          }

        }
       }
      
   

Então podemos criar nossas próprias exceções.Vamos criar a classe ErrodeProposito que herda de Exception.

    
      
      // Utilizamos a classe ErroDeProposito para mostrar uma mensagem específica que foi criada por nós.
      
      namespace WindowsFormsApplication  
      {
       public partial class FrmCadastro : Form 
       {
         public FrmCadastro()
         {
           InitializeComponent();
         }
         private void btnCalcular_Click(object sender, EventArgs e)
         {
          try
          {
            int numero = int.Parse(txtNumero.Text);

            if (numero == 2)
            {
              throw new ErroDeProposito ("Erro de Proposito")
            }
            else if (numero == 4)
            {
              throw new Exception ("Erro de Proposito generico")
            }

          }
          catch(FormatException errFormat)
          {
            MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
            txtNumero.Focus();
          }
          catch(ErroDeProposito errProposito)
          {
            MessageBox.Show("Erro de Propósito" + errProposito.stackTrace + ")");
            
          }
          catch(Exception err)
          {
            MessageBox.Show("Olá cliente, Aqui será mostrado o Erro de Exception " + err + ")");
            txtNumero.Focus();
          }
         }

       }
       public class ErroDeProposito : Exception 
       {
          public ErroDeProposito(string erro):base(erro)
          {
          }
       }


      }
     
  

É importante declarar as Exceptions da mais específica para a menos específica, pois se declararmos a Exception generica como a primeira da lista, todas as exception que ocorrer no try entrará no catch(Exception), porque todas herdam de Exception.

    
      
      // quando catch(Exception) for declarado no inicio, as outras exceptions específicas não serão reconhecidas
      
      namespace WindowsFormsApplication  
      {
       public partial class FrmCadastro : Form 
       {
         public FrmCadastro()
         {
           InitializeComponent();
         }
         private void btnCalcular_Click(object sender, EventArgs e)
         {
          try
          {
            int numero = int.Parse(txtNumero.Text);

            if (numero == 2)
            {
              throw new ErroDeProposito ("Erro de Proposito")
            }
            else if (numero == 4)
            {
              throw new Exception ("Erro de Proposito generico")
            }

          }
          
          //Aqui a Exception está no topo , então todas as exception entrarão aqui.
          catch(Exception err)
          {
            MessageBox.Show("Olá cliente, Aqui será mostrado o Erro de Exception " + err + ")");
            txtNumero.Focus();
          }

          catch(FormatException errFormat)
          {
            MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
            txtNumero.Focus();
          }
          catch(ErroDeProposito errProposito)
          {
            MessageBox.Show("Erro de Propósito" + errProposito.stackTrace + ")");
            
          }
      
         }

       }
       public class ErroDeProposito : Exception 
       {
          public ErroDeProposito(string erro):base(erro)
          {
          }
       }


      }
     
  

Finally

O Finally mostra a última ação depois do tratamento de erro.

O Finally não é obrigatório. Se for declarado, o sistema sempre vai entrar no bloco finally independente da condição.

Um exemplo de código no bloco finally seria fechar conexões ou fechar arquivo para que não fique ocupando espaço na memória.

    

      //O sistema sempre entrará no bloco finally .
      
      namespace WindowsFormsApplication  
      {
       public partial class FrmCadastro : Form 
       {
         public FrmCadastro()
         {
           InitializeComponent();
         }
         private void btnCalcular_Click(object sender, EventArgs e)
         {
          try
          {
            int numero = int.Parse(txtNumero.Text);

            if (numero == 2)
            {
              throw new ErroDeProposito ("Erro de Proposito")
            }
            else if (numero == 4)
            {
              throw new Exception ("Erro de Proposito generico")
            }

          }
          catch(FormatException errFormat)
          {
            MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
            txtNumero.Focus();
          }
          catch(ErroDeProposito errProposito)
          {
            MessageBox.Show("Erro de Propósito" + errProposito.stackTrace + ")");
            
          }
          catch(Exception err)
          {
            MessageBox.Show("Olá cliente, Aqui será mostrado o Erro de Exception " + err + ")");
            txtNumero.Focus();
          }
          //O sistema sempre entrará aqui .
          finally 
          {
            MessageBox.Show("Todas as minhas exceções tratadas");
          }
      
         }

       }
       public class ErroDeProposito : Exception 
       {
          public ErroDeProposito(string erro):base(erro)
          {
          }
       }


      }
     
  

Tratamento de erro

Nesta aula iremos aprender a utilizar os comandos try, catch, finally, throw e iremos ver um caso real de como e quando utilizar.

Próximas Aulas:
assinaturaAssine nossa Comunidade

Aplicação Windows -Tratamento de Erro

Tratamento de erro significa encapsular um bloco de código onde pode ocorrer erro.

Dessa forma evitamos que esse possível erro seja mostrado para o usuário e consequentemente, evitamos também que o sistema não feche de maneira inesperada.

Existe tratamento de erro em toda linguagem de programação.

No C# utilizamos a classe Exception com o TRY, CATCH, FINALLY e THROW para tratar os erros.

Temos como identificar ou diferenciar as classes de exceptions. Seguem alguns casos:

  • Se tentarmos converter uma string por um inteiro, o C# mostrará um erro que não pode converter esse item;
  • Se tentarmos conectar em um Banco de dados que está fora do ar, o C# mostrará uma outra exception;
  • Se tentarmos fazer um request e e mesmo retornar uma falha, o C# mostrará outra exception.

Try / Catch

Try encapsula o bloco de código que possivelmente dará um erro.

Catch local onde é capturado e feito o tratamento do erro.

Vamos mostrar um exemplo no qual vamos digitar uma letra no txtNumero e tentar fazer a conversão,ocorrerá um erro.

      
        
        // Erro ao atribuir um texto a  uma variável do tipo int.
        
        namespace WindowsFormsApplication  
        {
         public partial class FrmCadastro : Form 
         {
           public FrmCadastro()
           {
             InitializeComponent();
           }
           private void btnCalcular_Click(object sender, EventArgs e)
           {
              try
              {
                int numero = int.Parse(txtNumero.Text);
              }
              catch 
              {
                MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?");
                txtNumero.Focus();
              }
           }
         }
        }
       
    

Se não especificarmos a exception no catch, como mostrado acima, qualquer erro que ocorrer no bloco try, será mostrada a mesma mensagem.

Para que isso não aconteça, podemos declarar a exception especifica no catch, que neste caso é a FormatException.

      
        
        // Erro ao atribuir um texto a  uma variável do tipo int.
        
        namespace WindowsFormsApplication  
        {
         public partial class FrmCadastro : Form 
         {
           public FrmCadastro()
           {
             InitializeComponent();
           }
           private void btnCalcular_Click(object sender, EventArgs e)
           {
              try
              {
                int numero = int.Parse(txtNumero.Text);
              }
              catch(FormatException errFormat)
              {
                MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
                txtNumero.Focus();
              }

              catch(Exception err)
              {
                MessageBox.Show("Olá cliente, Esse é um erro genérico?" + err + ")");
                txtNumero.Focus();
              }

           }

         }
        }
       
    

Throw

Throw lança uma nova Exception que nós podemos criar.No exemplo, criaremos um throw com a mensagem "Erro de Propósito", que, quando o sistema executar esta linha, irá para o catch Exception e não para o FormatException.

     
       
       // A mensagem Erro de Propósito irá para o catch Exception
       
       namespace WindowsFormsApplication  
       {
        public partial class FrmCadastro : Form 
        {
          public FrmCadastro()
          {
            InitializeComponent();
          }
          private void btnCalcular_Click(object sender, EventArgs e)
          {
             try
             {
               int numero = int.Parse(txtNumero.Text);

               throw new Exception ("Erro de Proposito")
             }
             catch(FormatException errFormat)
             {
               MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
               txtNumero.Focus();
             }
             catch(Exception err)
             {
               MessageBox.Show("Olá cliente, Aqui será mostrado o Erro de Exception " + err + ")");
               txtNumero.Focus();
             }
          }

        }
       }
      
   

Então podemos criar nossas próprias exceções.Vamos criar a classe ErrodeProposito que herda de Exception.

    
      
      // Utilizamos a classe ErroDeProposito para mostrar uma mensagem específica que foi criada por nós.
      
      namespace WindowsFormsApplication  
      {
       public partial class FrmCadastro : Form 
       {
         public FrmCadastro()
         {
           InitializeComponent();
         }
         private void btnCalcular_Click(object sender, EventArgs e)
         {
          try
          {
            int numero = int.Parse(txtNumero.Text);

            if (numero == 2)
            {
              throw new ErroDeProposito ("Erro de Proposito")
            }
            else if (numero == 4)
            {
              throw new Exception ("Erro de Proposito generico")
            }

          }
          catch(FormatException errFormat)
          {
            MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
            txtNumero.Focus();
          }
          catch(ErroDeProposito errProposito)
          {
            MessageBox.Show("Erro de Propósito" + errProposito.stackTrace + ")");
            
          }
          catch(Exception err)
          {
            MessageBox.Show("Olá cliente, Aqui será mostrado o Erro de Exception " + err + ")");
            txtNumero.Focus();
          }
         }

       }
       public class ErroDeProposito : Exception 
       {
          public ErroDeProposito(string erro):base(erro)
          {
          }
       }


      }
     
  

É importante declarar as Exceptions da mais específica para a menos específica, pois se declararmos a Exception generica como a primeira da lista, todas as exception que ocorrer no try entrará no catch(Exception), porque todas herdam de Exception.

    
      
      // quando catch(Exception) for declarado no inicio, as outras exceptions específicas não serão reconhecidas
      
      namespace WindowsFormsApplication  
      {
       public partial class FrmCadastro : Form 
       {
         public FrmCadastro()
         {
           InitializeComponent();
         }
         private void btnCalcular_Click(object sender, EventArgs e)
         {
          try
          {
            int numero = int.Parse(txtNumero.Text);

            if (numero == 2)
            {
              throw new ErroDeProposito ("Erro de Proposito")
            }
            else if (numero == 4)
            {
              throw new Exception ("Erro de Proposito generico")
            }

          }
          
          //Aqui a Exception está no topo , então todas as exception entrarão aqui.
          catch(Exception err)
          {
            MessageBox.Show("Olá cliente, Aqui será mostrado o Erro de Exception " + err + ")");
            txtNumero.Focus();
          }

          catch(FormatException errFormat)
          {
            MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
            txtNumero.Focus();
          }
          catch(ErroDeProposito errProposito)
          {
            MessageBox.Show("Erro de Propósito" + errProposito.stackTrace + ")");
            
          }
      
         }

       }
       public class ErroDeProposito : Exception 
       {
          public ErroDeProposito(string erro):base(erro)
          {
          }
       }


      }
     
  

Finally

O Finally mostra a última ação depois do tratamento de erro.

O Finally não é obrigatório. Se for declarado, o sistema sempre vai entrar no bloco finally independente da condição.

Um exemplo de código no bloco finally seria fechar conexões ou fechar arquivo para que não fique ocupando espaço na memória.

    

      //O sistema sempre entrará no bloco finally .
      
      namespace WindowsFormsApplication  
      {
       public partial class FrmCadastro : Form 
       {
         public FrmCadastro()
         {
           InitializeComponent();
         }
         private void btnCalcular_Click(object sender, EventArgs e)
         {
          try
          {
            int numero = int.Parse(txtNumero.Text);

            if (numero == 2)
            {
              throw new ErroDeProposito ("Erro de Proposito")
            }
            else if (numero == 4)
            {
              throw new Exception ("Erro de Proposito generico")
            }

          }
          catch(FormatException errFormat)
          {
            MessageBox.Show("Olá cliente, você digitou letra no lugar de número aqui?" + errFormat + ")");
            txtNumero.Focus();
          }
          catch(ErroDeProposito errProposito)
          {
            MessageBox.Show("Erro de Propósito" + errProposito.stackTrace + ")");
            
          }
          catch(Exception err)
          {
            MessageBox.Show("Olá cliente, Aqui será mostrado o Erro de Exception " + err + ")");
            txtNumero.Focus();
          }
          //O sistema sempre entrará aqui .
          finally 
          {
            MessageBox.Show("Todas as minhas exceções tratadas");
          }
      
         }

       }
       public class ErroDeProposito : Exception 
       {
          public ErroDeProposito(string erro):base(erro)
          {
          }
       }


      }