Olá pessoal, já faz um bom tempo!

 

Esse é um post curto e rápido de demonstra a captura de erros no MySQL. A partir da versão 5.6.4, foi implementada uma nova funcionalidade chamada GET DIANOSTICS. Esse comando produz informações que populam uma área de diagnósticos. Eu acho muito útil a implementação desse cara seja em stored procedures ou no próprio código fonte do software como uma forma de logar erros em tempo de execução. Não há um privilégio específico para execução desse comando.

Para tratamento de erros em stored procedures, podemos utilizar o seguinte bloco de código:

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT ...;
END;

Porém o comando acima, apenas trata uma exception quando executado o batch.

Para enriquecer esse bloco de código e efetivamente checar o erro que ocorreu, adicionaremos o comando GET DIAGNOSTICS, conforme ilustrado abaixo:

GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
 @nroerro = MYSQL_ERRNO, @msgerro = MESSAGE_TEXT;
SELECT @sqlstate, @nroerro, @msgerro;

Melhorando um pouco mais a instrução, podemos concatenas as informações de erro em uma única string e assim ou retornar ao front-end ou armazenar em um tabela de erros ou arquivo de logs:

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
 @nroerro = MYSQL_ERRNO, @msgerro = MESSAGE_TEXT;
SET @msg_erro_completa = CONCAT("ERRO: ", @nroerro, " (", @sqlstate, "): ", @msgerro);
SELECT @msg_erro_completa;
END;

A instrução acima exibirá da seguinte forma:

mysql> call prTesteErroTratado('abc');
+--------------------------------------------------+
| @msg_erro_completa                               |
+--------------------------------------------------+
| ERROR 1146 (42S02): Table 'db1.t1' doesn't exist |
+--------------------------------------------------+
1 row in set (0.01 sec)

 

Para maiores detalhes, http://dev.mysql.com/doc/refman/5.6/en/get-diagnostics.html.

 

Espero que ajude

Abraços

 

Léo Lopes