none
Onde e pra que utilizar o try...catch? RRS feed

  • Pergunta

  • Já cheguei a ler os outros tópicos sobre o assunto, porém ainda tenho dúvida, pois não vejo porque utilizar o try catch para coletar um erro se posso coletá-lo no global. asax. Faço meus sistemas utilizando um código de redirecionamento no evento de erro do global.asax. Assim consigo redirecionar para uma página de erro genérica e amigável ao usuário e ainda salvar o erro no banco para correção posterior.

    E gostaria de saber tb, onde utilizar... Nas funções  do codigo behind de cada página, nas classes de negócio, nas classes de entidade.

    Segue código global.asax

    protected void Application_Error(object sender, EventArgs e) {

    // Objeto para receber o erro e outra informaçoes Exception obj_exeption = new Exception();

    // Minha classe de negócio para tratar exceções ExceptionBO exceptions = new ExceptionBO();

    // Minha classe de entidade da tabela exception gerada pelo entity framework exception exception = new exception(); obj_exeption = Server.GetLastError().GetBaseException(); exception.erro = obj_exeption.Message; exception.source = obj_exeption.Source; exception.url_anterior = Request.Url.AbsoluteUri; exception.url_posterior = Request.UrlReferrer.AbsoluteUri; exception.data_registro = DateTime.Now; exceptions.Add(exception); exceptions.SaveChanges(); exceptions = null; exception = null; obj_exeption = null; Response.Redirect("pag-erro.aspx"); }


    quinta-feira, 23 de agosto de 2012 12:17

Respostas

  • Junior o uso do try...catch é exatamente para tratar um erro usamos principalmente qdo vamos acessar o banco de dados, pois podem ocorrer problemas inerentes a aplicação, tipo o servidor de banco nao está on line então vc tratar esse erro e mostra na página para o usuário que ocorreu o erro, o tratamento vai do desenvolvedor, se for um erro de banco vc pode pegar o código do erro gerado e criar uma mensagem mais explicativa para o usuário ou então uma generica tipo "erro de acesso ao banco de dados" eu sempre trato os dois faço assim

    try
    {
    
    } 
    catch (Exception ex)
                {
                    if (ex.Message.ToLower().Contains("innerexception"))
                    {
                        FailureText.Text = ex.InnerException.Message;
                    }
                    else
                    {
                        FailureText.Text = ex.Message;
                    }
                }


    Junior

    quinta-feira, 23 de agosto de 2012 12:24

Todas as Respostas

  • Junior o uso do try...catch é exatamente para tratar um erro usamos principalmente qdo vamos acessar o banco de dados, pois podem ocorrer problemas inerentes a aplicação, tipo o servidor de banco nao está on line então vc tratar esse erro e mostra na página para o usuário que ocorreu o erro, o tratamento vai do desenvolvedor, se for um erro de banco vc pode pegar o código do erro gerado e criar uma mensagem mais explicativa para o usuário ou então uma generica tipo "erro de acesso ao banco de dados" eu sempre trato os dois faço assim

    try
    {
    
    } 
    catch (Exception ex)
                {
                    if (ex.Message.ToLower().Contains("innerexception"))
                    {
                        FailureText.Text = ex.InnerException.Message;
                    }
                    else
                    {
                        FailureText.Text = ex.Message;
                    }
                }


    Junior

    quinta-feira, 23 de agosto de 2012 12:24
  • Bom dia Junior_luiz, primeiramente obrigado pela atenção.

    Concordor com você, mas pra que utilizar o codigo try cacth se através desta linha:

     obj_exeption = Server.GetLastError().GetBaseException();
    Eu consigo pegar o erro de qualquer  página, tratá-lo e exibi-lo de forma mais amigável para o usuário. Percebe? Não vejo porque fazer o tratamento especifico dentro de cada método, função, se posso captá-lo no global da mesma forma.
    quinta-feira, 23 de agosto de 2012 12:39
  • Bom dia Junior_luiz, primeiramente obrigado pela atenção.

    Concordor com você, mas pra que utilizar o codigo try cacth se através desta linha:

     obj_exeption = Server.GetLastError().GetBaseException();
    Eu consigo pegar o erro de qualquer  página, tratá-lo e exibi-lo de forma mais amigável para o usuário. Percebe? Não vejo porque fazer o tratamento especifico dentro de cada método, função, se posso captá-lo no global da mesma forma.

    Junior imagine o seguinte cenario, onde o usuario tenha que preencher 40 campos de entrada na sua pagina, neste meio tempo ele preencheu tudo e quando clicou no botão algum erro não tratado é disparado, é meio frustante para ele ser redirecionado para uma pagina de erro, sem ao menos saber oque aconteceu.

    A dupla try/catch e o método Application_Error dentro Global.asax é uma excelente combinação para tratamento de erros esperados e não esperados.


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

    quinta-feira, 23 de agosto de 2012 12:54
  • O bloco try catch serve para tratamento de exceções.

    Ao utilizarmos o try catch, devemos ter em mente que para capturar as exceções partimos das mais específicas(IoException,SQLException,RunTimeException,...) para as mais genéricas(Exception).


    Atenciosamente, Marcio Nogueira Cardoso Pinto.

    quinta-feira, 23 de agosto de 2012 13:11
  • Junior a abordagem para tratamento de erro vc adota a que mais lhe convier, mais o try catch como falou o Marcio é para tratamento de exceções o objetivo é pegar o erro se ele acontecer e tratá-lo vc pode até ter um finally tb, mais se vc já tem a abordagem pelo global.asax e ele resolve seus problemas, então não mude de abordagem. Eu só acho que o try.. catch é mais fléxivel.

    Junior

    quinta-feira, 23 de agosto de 2012 13:17
  • Bom dia Junior_luiz, primeiramente obrigado pela atenção.

    Concordor com você, mas pra que utilizar o codigo try cacth se através desta linha:

     obj_exeption = Server.GetLastError().GetBaseException();
    Eu consigo pegar o erro de qualquer  página, tratá-lo e exibi-lo de forma mais amigável para o usuário. Percebe? Não vejo porque fazer o tratamento especifico dentro de cada método, função, se posso captá-lo no global da mesma forma.

    Junior imagine o seguinte cenario, onde o usuario tenha que preencher 40 campos de entrada na sua pagina, neste meio tempo ele preencheu tudo e quando clicou no botão algum erro não tratado é disparado, é meio frustante para ele ser redirecionado para uma pagina de erro, sem ao menos saber oque aconteceu.

    A dupla try/catch e o método Application_Error dentro Global.asax é uma excelente combinação para tratamento de erros esperados e não esperados.


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

    kkkk....40 campos é realmente frustrante...

    Fiquei pensando, se o erro acontece, de certa forma não há como voltar atrás, ou seja, o leite já foi derramado. Desta forma, não vejo problema quando a um erro genérico, já que uma "desculpa" será gerada de qualquer forma. O usuário ficará triste da mesma forma com uma mensagem do tipo "Não foi possível se conectar ao se banco de dados." ou outra mais genérica do tipo "O servidor se comportou de forma inesperada." A diferença tá na quantidade de try...catch que se eliminaria da codificacao...

    quinta-feira, 23 de agosto de 2012 13:18
  • O exemplo do MSDN também pode ajudar a clarear um pouco as idéias: http://msdn.microsoft.com/en-us/library/0yd65esw(v=vs.80).aspx

    Abraços!

    quinta-feira, 23 de agosto de 2012 13:57
  • Infelizmente não temos como fugir dessa situação, o que vc pode fazer é usar script assim vc obriga o usuário é digitar somente informações que vc espera, tipo em campo que só aceita números e como te falei só tratamos os erros após algum evento não temos como fazer isso a todo momento.

    Junior

    quinta-feira, 23 de agosto de 2012 13:58