Introduo ao tratamento de Excees

O seu cdigo vai dar erro. Isso um fato. Mesmo que seja a pessoa mais cuidadosa do mundo, voc tem que preparar o seu cdigo para o pior: O bug! At porque no momento que os erros aparecerem, voc vai precisar verificar o que est ocorrendo e ajustar da forma mais rpida possvel.
E tem outra:Ningum gosta de rodar uma aplicao e dar de cara com uma tela exibindo o stack do erro.
E para isso, voc deve tratar as excees que o teu cdigo pode gerar.

Mas antes de entrar no assunto de tratamento de erros, primeiramente, gostaria de alinharalgumas ideias…

Esse ser oprimeirode uma srie de 2 ou 3 posts, veremos como ficar o prximo, pois este j ficou consideravelmente grande.

Tente fazer uma consulta em um objeto que no existe, uma tabela, por exemplo, e veja o erro que ir aparecer:

Msg 208, Level 16, State 1, Line 2
Invalid object name dbo.TabelaErrada.

Repare, temos 5 ‘itens’ a avaliar:

  1. Msg: Valor da colunamessage_idna tabela sys.messages.
  2. Level: Severidade. o tipo de erro que o SQL Server gerou. O nvel varia de 0 (zero) a 24. Um resumo:
    1. 0 a 10:Mensagens no severas ou informacionais.
    2. 11 a 16: Erros que podem ser corrigidos pelo usurio, como: deadlocks, erros de sintaxe ou permisso, por exemplo.
    3. 17 a 19: Erros que devem ser repassados para o administrador, que o usurio no tem como resolver por conta prpria, como: Falta de memria ou espao em disco. Detalhes:
      1. Erros com severidade 18 ainda mantem a conexo ativa e o batch continua a execuo, porm o administrador deve ser informado do problema ocorrido.
      2. Erros com severidade 19 encerram todo o batch em execuo e o administrador do sistema deve ser contactado imediatamente.
    4. 20 a 24: Erros fatais. Erros com esta severidade indicam que a tarefa que est executando o processo do Database Engine parou a execuo ou que existe algum objeto que est danificado.
      1. Os Erros de severidade 19 a 24 so gravador no Error Log.
  3. State: Um nico erro pode ser disparado por diversas condies. Cada uma dessas condies soos estados. Ele muito utilizado ao pesquisar por um erro nas bases de conhecimento, ou pelo time da Microsoft para identificar a posio onde o erro foi gerado.
  4. Line: A linhaonde o erro foi chamado.
  5. Invalid Object Name: A descrio do erro propriamente dito.

Para maiores detalhes no que diz respeito ao Level e ao State, vejam os seguintes links:

Agora, encapsule essa tabela em uma procedure e veja o que acontece:

Msg 208, Level 16, State 1, Procedure prListaTabelaNaoExistente, Line 9
Invalid object name ‘TabelaNaoExistente’.

Note que agora existemais um item a avaliar: o local que chamou o objeto invlido.

Para mostrar o comportamento do que foi dito acima, criarei uma tabela e, ento, vou forar alguns erros…

Agora, veja o erro que ocorre ao tentar inserir o mesmo registro, causando um conflito de Primary Key.

Msg 2627, Level 14, State 1, Line 13
Violation of PRIMARY KEY constraint ‘PK__Clientes__C1FE6AA95FA89FA3’.
Cannot insert duplicate key in object ‘dbo.Clientes’. The duplicate key value is (1).
The statement has been terminated.

Lembra-se quando eu comentei sobre a severidade dos erros? Veja o que acontece quando tentos inserir 3 registros, sendo o segundo duplicado.

Veja, mesmo tendo umregistro duplicado no meio do batch, tive a execuo do ltimo insert. Veja o “level 14”, que indica que o erro pode ser ajustado pelo usurio. Nesse caso, apenas o statement abortado, mas obatch continua sendo executado normalmente at o final.

E se eu quisesse que o batch restante fosse encerradono momento do erro, e no apenas o statement? Para isto, existe uma opo chamada XACT_ABORT, que realiza esse comportamento. Agora, note que o comportamento diferente caso o batch esteja dentro damesma transao. Veja:

Percebeu? Quando existe uma transao, realizado o rollback de toda a transao. Ficou mais claroo uso do XACT_ABORT? Para maiores detalhes, veja em:https://msdn.microsoft.com/pt-br/library/ms188792%28v=sql.120%29.aspx?f=255&MSPPError=-2147217396

Antes de entrar nos tratamentos de excees, gostaria de explicar algo muito comum no processo de desenvolvimento: Procedures aninhadas. Quando ocorre um erro, qual o comportamento?

Imagine a situao: Usurio executa a procedure1 que, dentro dela, chama a procedure2 e, em seguida, a procedure3. O que vai acontecer? A resposta: Depende. Vejamos:

  • Se o contedo da procedure2 causar a finalizao de um statement, todo o resto da procedure ser exectada, bem como a procedure3.
  • Um erro na procedure2 pode causar a finalizao de toda a procedure, mas permitir que a procedure3 seja executada normalmente – uma consulta a uma tabela inexistente pode causar esse tipo de erro:
  • Um erro na procedure2 pode causar o encerramento de todo o batch subsequente. Um exemplo: Erro de converso:

    Posso ir alm e dizer que, no meio da execuo, ocorre um erro de severidade 20 ou maior. Lembra o que ocorre? A finalizao da conexo, com a possibilidade de registro em log. Quer saber quais os erros que podem causar o encerramento da conexo?

  • Troque o language_id para 1046 para ver as mensagens em portugus.

Nos vemos no prximos post sobre o assunto!

Um comentário

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.