44.2. Mensagens de erro geradas pelo servidor

As mensagens de erro, de advertência e de log geradas a partir do código do servidor devem ser criadas utilizando ereport, ou seu primo mais antigo elog. A utilização desta função é suficientemente complexa para merecer uma explicação.

Existem dois elementos requeridos em todas as mensagens: o nível de severidade (indo de DEBUG até PANIC), e o texto primário da mensagem. Além desses, existem elementos opcionais, sendo o mais comum o código de identificação do erro que segue as convenções para SQLSTATE da especificação do padrão SQL. O próprio ereport é apenas uma casca de função, que existe principalmente pela comodidade sintática de fazer a geração de mensagens se parecer com uma chamada de função no código fonte C. O único parâmetro aceito diretamente pelo ereport é o nível de severidade. O texto primário da mensagem, e todos os elementos opcionais da mensagem, são gerados chamando funções auxiliares, como errmsg, dentro da chamada a ereport.

Uma chamada típica a ereport se parece com:

ereport(ERROR,
        (errcode(ERRCODE_DIVISION_BY_ZERO),
         errmsg("divisão por zero")));

Esta chamada especifica o nível de severidade do erro ERROR (um erro comum). A chamada a errcode especifica o código de erro SQLSTATE utilizando a macro definida em src/include/utils/errcodes.h. A chamada a errmsg especifica o texto primário da mensagem. Deve-se observar o conjunto extra de parênteses envolvendo as chamadas a funções auxiliares — são aborrecidos mas são sintaticamente necessários.

Abaixo está mostrado um exemplo mais complexo:

ereport(ERROR,
        (errcode(ERRCODE_AMBIGUOUS_FUNCTION),
         errmsg("a função %s não é única",
                func_signature_string(funcname, nargs,
                                      actual_arg_types)),
         errhint("Não foi possível escolher a função melhor candidata. "
                 "Pode ser necessário adicionar conversões de tipo explícitas.")));

Este exemplo mostra a utilização dos códigos de formato para incorporar valores em tempo de execução ao texto da mensagem; também fornece uma mensagem opcional de "dica" (hint).

As rotinas auxiliares disponíveis para ereport são:

Existe uma função mais antiga elog que ainda é muito utilizada. Uma chamada a elog

elog(nível, "cadeia de caracteres de formatação", ...);

é exatamente equivalente a

ereport(nível, (errmsg_internal("cadeia de caracteres de formatação", ...)));

Deve ser observado que o código de erro SQLSTATE é sempre o padrão, e que a cadeia de caracteres da mensagem não é incluída no dicionário de internacionalização de mensagens. Portanto, elog deve ser utilizada apenas para erros internos e para registro de depuração de baixo nível. Toda mensagem que possivelmente será de interesse dos usuários comuns deve ser emitida através de ereport. Apesar disso, existe no sistema um número suficiente de verificação de erros "que não podem acontecer" para que elog ainda seja muito utilizada; é preferida para estas mensagens devido à simplicidade de sua notação.

Podem ser encontrados bons conselhos sobre como escrever boas mensagens de erro na Seção 44.3.

Notas

[1]

Ou seja, o valor corrente quando a chamada a ereport foi encontrada; mudanças em errno dentro das rotinas auxiliares não vão afetá-lo. Isto não seria verdade se fosse escrito explicitamente strerror(errno) na lista de parâmetros de errmsg; por isso, não o faça.

SourceForge.net Logo CSS válido!