none
Pegar try catch(exception) RRS feed

  • Pergunta

  •  Uso VS2010, c# aspnet4, SQLserver2008, entity

    Uso SQLServer2008 e EntityFramework, Tenho a tabela Paciente, com o campo Nome (unique),

    Com faço para saber e pegar o erro específico se o usuário tentar inserir um nome que já existe, e adicionar o erro ao LblErro.Text

      protected void BtnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                ----->   aqui fica o código para salvar, está funcionando ok
            }
            catch (Exception)
            {
                LblErro.Text = "Desculpe!...";
            }
        }


    • Editado Álvaro Luiz quarta-feira, 5 de setembro de 2012 10:36
    quarta-feira, 5 de setembro de 2012 10:14

Respostas

  • Sempre que puder evitar, deixe o (Excepetion ex) em último em uma linha de catch, ele é muito pesado e lento. tente sempre descobrir os possíveis erros e coloque os catch's possíveis em uma linha de estrutura de cima pra baixo ( Exception em último).

    Exemplo:

    (SqlException ex)

    (ErrorException ex)

    (Exception ex)


    Se a resposta foi útil por favor qualifique. Italo Biguzi Duarte, Desenvolvedor ASP.NET C#, Italo.biguzzi@gmail.com

    • Marcado como Resposta Álvaro Luiz segunda-feira, 10 de setembro de 2012 00:36
    quinta-feira, 6 de setembro de 2012 11:28
  • Vitor consegui pegar assim, tá certo dessa forma?

    catch (Exception ex)
            {
                if (((ex.InnerException).InnerException).Message.Contains("UNIQUE KEY"))
                {
                    LblResposta.Text = "erro duplicidade ";
                }
            }


    Esta, porem seu código pode disparar uma exception caso o InnerException esteja nulo:

    try
    {
        //Entity
    }
    catch (Exception ex)
    {
        if (ex.InnerException != null)
            if (ex.InnerException.Message.Contains("UNIQUE KEY")) ;
                //Seu código de tratamento
    
    }

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    • Marcado como Resposta Álvaro Luiz quarta-feira, 5 de setembro de 2012 13:45
    • Não Marcado como Resposta Álvaro Luiz quarta-feira, 5 de setembro de 2012 16:44
    • Marcado como Resposta Álvaro Luiz segunda-feira, 10 de setembro de 2012 00:36
    quarta-feira, 5 de setembro de 2012 13:14

Todas as Respostas

  • Bom dia

    Tente isso aqui

    protected void BtnSalvar_Click(object sender, EventArgs e)
    {
        try
        {
            ----->   aqui fica o código para salvar, está funcionando ok
        }
        catch (Exception e)
        {
            LblErro.Text = "Desculpe!..." + e.message;
        }
    }


    Bruno Viegas D. Ribeiro

    quarta-feira, 5 de setembro de 2012 11:02
  • Olá Bruno

    Gostaria de saber se o erro que gerou é referente a um tentativa de inserir um nome que já existe no banco, duplicidade, lembrado que uso SQLServer2008 e EntityFramework,

    algo assim:

    catch(Exception erro)
    {
        if(erro.number == xxxx) // duplicidade
        {
          //voce tentou inserir um registro que já existe
         }


    quarta-feira, 5 de setembro de 2012 11:06
  • Boa_Vida o correto seria você validar campos que contenha constraint do tipo unique antes do insert/update, alertando o usuário de uma possível duplicidade. Deixar estourar a exception seria o ultimo caso, o Number para válidação é 2601, caso o tipo da exception seja SqlException:

    const int SqlDuplicateKeyError = 2601; 
      
    try 
    { 
        db.Update(record); 
    } 
    catch (SqlException ex) 
    { 
        switch (ex.Number) 
        { 
            case SqlDuplicateKeyError: 
                // Custom error handling here 
            default: 
                throw; 
        } 
    }

    Referencia:

    http://stackoverflow.com/questions/2082529/t-sql-reporting-duplicate-key-exception-to-user-in-simple-manner


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    quarta-feira, 5 de setembro de 2012 11:30
  • Olá Vitor,

    Esse (SqlException ex) não funcionou com EntityFramework

    quarta-feira, 5 de setembro de 2012 12:07
  • Certamente o Exception que foi disparado do entity é um UpdateException ou InsertException caso seja insert, tente pegar o InnerException e verificar se pertence ao SQL:

    try
    {
        db.Update(record);
    }
    catch (Exception ex)
    {
        if (ex.InnerException is System.Data.SqlClient.SqlException)
        {
            switch (((System.Data.SqlClient.SqlException)ex.InnerException).Number)
            {
                case SqlDuplicateKeyError:
                // Custom error handling here 
                default:
                    throw;
            }
        }
    }


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    quarta-feira, 5 de setembro de 2012 12:32
  • Vitor Fiz assim

    catch (Exception ex)
            {
                if (ex.InnerException is System.Data.SqlClient.SqlException)
                {
                    if (((System.Data.SqlClient.SqlException)ex.InnerException).Number == 2601) 
                    {                
                       LblResposta.Text = "Duplicado";
                    }
                }          
                else
                {
                    LblResposta.Text = ex.Message;        --------------> entrou aqui e deu o erro abaixo
                }
            }

    -----------------

    retorno assim

    An error occurred while saving entities that do not expose foreign key properties for their relationships. The GetEntityEntry method will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details.

    quarta-feira, 5 de setembro de 2012 12:38
  • Vitor consegui pegar assim, tá certo dessa forma?

    catch (Exception ex)
            {
                if (((ex.InnerException).InnerException).Message.Contains("UNIQUE KEY"))
                {
                    LblResposta.Text = "erro duplicidade ";
                }
            }

    quarta-feira, 5 de setembro de 2012 12:59
  • Vitor consegui pegar assim, tá certo dessa forma?

    catch (Exception ex)
            {
                if (((ex.InnerException).InnerException).Message.Contains("UNIQUE KEY"))
                {
                    LblResposta.Text = "erro duplicidade ";
                }
            }


    Esta, porem seu código pode disparar uma exception caso o InnerException esteja nulo:

    try
    {
        //Entity
    }
    catch (Exception ex)
    {
        if (ex.InnerException != null)
            if (ex.InnerException.Message.Contains("UNIQUE KEY")) ;
                //Seu código de tratamento
    
    }

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    • Marcado como Resposta Álvaro Luiz quarta-feira, 5 de setembro de 2012 13:45
    • Não Marcado como Resposta Álvaro Luiz quarta-feira, 5 de setembro de 2012 16:44
    • Marcado como Resposta Álvaro Luiz segunda-feira, 10 de setembro de 2012 00:36
    quarta-feira, 5 de setembro de 2012 13:14
  • Vitor desmarquei a resposta só pra voce me responder mais esse, (depois marco de novo ;-) )

    É preciso eu por esse segundo else

     if (ex.InnerException != null)
    {
                    if (((ex.InnerException).InnerException).Message.Contains("REFERENCE"))
                    {
                        msgException.Value = ("registro sendo referenciado");
                    }
                   else
                  {
                       msgException.Value = ("ERRO AO EXCLUIR REGISTROS");
                  }
               }

    else  --------> é necessário esse segundo else caso o ex.InnerException ==null  ??

                {
                    msgException.Value = ("ERRO AO EXCLUIR REGISTROS");
                }
            }



    • Editado Álvaro Luiz quarta-feira, 5 de setembro de 2012 16:45
    quarta-feira, 5 de setembro de 2012 13:54
  • Sempre que puder evitar, deixe o (Excepetion ex) em último em uma linha de catch, ele é muito pesado e lento. tente sempre descobrir os possíveis erros e coloque os catch's possíveis em uma linha de estrutura de cima pra baixo ( Exception em último).

    Exemplo:

    (SqlException ex)

    (ErrorException ex)

    (Exception ex)


    Se a resposta foi útil por favor qualifique. Italo Biguzi Duarte, Desenvolvedor ASP.NET C#, Italo.biguzzi@gmail.com

    • Marcado como Resposta Álvaro Luiz segunda-feira, 10 de setembro de 2012 00:36
    quinta-feira, 6 de setembro de 2012 11:28