41.9. Erros e mensagens #

41.9.1. Relato de erros e mensagens
41.9.2. Verificação de asserções

41.9.1. Relato de erros e mensagens #

A instrução RAISE é usada para relatar mensagens e lançar erros.

RAISE [ nível ] 'formato' [, nível [, ... ]] [ USING opção { = | := } expressão [, ... ] ];
RAISE [ nível ] nome_da_condição [ USING opção { = | := } expressão [, ... ] ];
RAISE [ nível ] SQLSTATE 'sqlstate' [ USING opção { = | := } expressão [, ... ] ];
RAISE [ nível ] USING opção { = | := } expressão [, ... ];
RAISE ;

O nível (opcional) especifica a gravidade do erro. Os níveis permitidos são DEBUG, LOG, INFO, NOTICE, WARNING e EXCEPTION, sendo este último o padrão. EXCEPTION levanta um erro (que normalmente interrompe a transação corrente); os outros níveis geram apenas mensagens de diferentes níveis de prioridade. Se as mensagens de uma determinada prioridade são mostradas ao cliente, escritas no registro de mensagens do servidor, ou ambos, é controlado pelas variáveis de configuração log_min_messages e client_min_messages. Veja Configuração do servidor para obter mais informações.

Na primeira variante da sintaxe, após o nível se houver, deve ser escrita a cadeia de caracteres do formato (que deve ser uma cadeia de caracteres literal simples, e não uma expressão). A cadeia de caracteres do formato especifica o texto da mensagem de erro a ser relatada. A cadeia de caracteres de formatação pode ser seguida por expressões de argumento opcionais a serem inseridas na mensagem. Dentro da cadeia de caracteres de formatação, % é substituído pela representação em cadeia de caracteres do valor do próximo argumento opcional. Deve ser escrito %% para produzir um % literal. O número de argumentos deve corresponder ao número de marcadores de posição % na cadeia de caracteres de formatação, ou será lançado um erro durante a compilação da função.

Neste exemplo, o valor de v_job_id substituirá o % na cadeia de caracteres:

RAISE NOTICE 'Chamando cs_create_job(%)', v_job_id;

Na segunda e terceira variantes da sintaxe, o nome_da_condição e sqlstate especificam um nome para a condição de erro ou um código SQLSTATE de cinco caracteres, respectivamente. Veja em Códigos de erro do PostgreSQL os nomes de condições de erro válidos e os códigos SQLSTATE predefinidos.

A seguir estão alguns exemplos de uso de nome_da_condição e sqlstate:

RAISE division_by_zero;
RAISE WARNING SQLSTATE '22012';

Em qualquer uma dessas variantes de sintaxe, podem ser anexadas informações adicionais ao relatório de erros escrevendo USING seguido de itens opção = expressão. Cada expressão pode ser qualquer expressão com valor de cadeia de caracteres. As palavras-chave permitidas para opção são:

MESSAGE #

Define o texto da mensagem de erro. Esta opção não pode ser usada na primeira variante de sintaxe, porque a mensagem já está fornecida.

DETAIL #

Fornece uma mensagem detalhada do erro.

HINT #

Fornece uma mensagem de dica.

ERRCODE #

Especifica o código de erro (SQLSTATE) a ser relatado, seja pelo nome da condição, conforme mostrado em Códigos de erro do PostgreSQL, ou diretamente como um código SQLSTATE de cinco caracteres. Esta opção não pode ser usada na segunda ou terceira variante da sintaxe, uma vez que o código de erro já foi fornecido.

COLUMN
CONSTRAINT
DATATYPE
TABLE
SCHEMA #

Fornece o nome de um objeto relacionado.

Este exemplo irá abortar a transação com a mensagem de erro e a dica fornecidas:

RAISE EXCEPTION 'Inexistente ID --> %', user_id
      USING HINT = 'Por favor, verifique seu ID de usuário.';

Estes dois exemplos mostram maneiras equivalentes de definir o SQLSTATE:

RAISE 'ID de usuário duplicado: %', user_id USING ERRCODE = 'unique_violation';
RAISE 'ID de usuário duplicado: %', user_id USING ERRCODE = '23505';

Outra forma de produzir o mesmo resultado seria:

RAISE unique_violation USING MESSAGE = 'ID de usuário duplicado: ' || user_id;

Conforme mostrado na quarta variante da sintaxe, também é possível escrever RAISE USING ou RAISE nível USING e colocar todo o resto na lista USING.

A última variante do RAISE não possui parâmetros. Esta forma só pode ser usada dentro de uma cláusula EXCEPTION de um bloco BEGIN; isto faz com que o erro que está sendo tratado seja relançado.

Nota

Antes do PostgreSQL 9.1, RAISE sem parâmetros era interpretado como relançamento do erro do bloco contendo o tratador de exceção ativo. Assim, uma cláusula EXCEPTION aninhada dentro desse tratador não poderia capturá-la, mesmo se o RAISE estivesse dentro do bloco da cláusula EXCEPTION aninhada. Isto foi considerado surpreendente, além de ser incompatível com o PL/SQL da Oracle.

Se não for especificado nenhum nome de condição ou SQLSTATE em um comando RAISE EXCEPTION, o padrão é usar raise_exception (P0001). Se não for especificado nenhum texto de mensagem, o padrão é usar o nome da condição ou SQLSTATE como texto de mensagem.

Nota

Ao especificar um erro pelo código SQLSTATE, não se está limitado aos códigos de erro predefinidos, podendo ser escolhido qualquer código de erro composto por cinco dígitos e/ou letras ASCII maiúsculas, exceto 00000. É recomendado que se evite lançar códigos de erro que terminem com três zeros, porque são códigos de categoria, só podendo ser interceptados interceptando toda a categoria.

41.9.2. Verificação de asserções #

A instrução ASSERT é um atalho conveniente para inserir verificações de depuração em funções escritas em PL/pgSQL.

ASSERT condição [ , mensagem ];

A condição é uma expressão booleana que deve ser sempre avaliada como verdade; se for, a instrução ASSERT não fará mais nada. Se o resultado for falso ou nulo, será gerada uma exceção ASSERT_FAILURE. (Se ocorrer um erro durante a avaliação da condição, será relatado como um erro normal.)

Se for fornecida a mensagem opcional, ela será uma expressão cujo resultado (se não for nulo) substituirá o texto da mensagem de erro padrão asserção falhou, no caso da condição falhar. A expressão da mensagem não é avaliada no caso normal onde a asserção é bem-sucedida.

O teste de asserções pode ser ativado ou desativado por meio do parâmetro de configuração plpgsql.check_asserts, que recebe um valor booleano; o padrão é on. Se este parâmetro estiver off, então as instruções ASSERT não farão nada.

Note que ASSERT destina-se a detectar erros de programa, e não a relatar condições de erro comuns. Para este fim deve ser usada a instrução RAISE descrita acima.