7

¿Es posible crear condiciones personalizadas cuando presento una excepción? Considere el siguiente ejemplo:Condiciones de excepción personalizadas de PostgreSQL

BEGIN  
    y := x/0; 
EXCEPTION 
    WHEN division_by_zero THEN 
     RAISE NOTICE 'caught division_by_zero'; 
     RETURN x; 
END; 

Aquí utilizo condición 'division_by_zero' para detectar la excepción. Lo que me gustaría hacer es algo como esto:

BEGIN  
    [...] 
    RAISE custom_condition; 
EXCEPTION 
    WHEN custom_condition THEN 
     [...] 
END; 

de modo que no interfieran con las posibles excepciones estándar. Podría simplemente hacer y: = 1/0; y atrapa division_by_zero, pero no se ve bien.

Respuesta

15
begin 
    if $1='bar' then 
     raise exception using 
      errcode='NOBAR', 
      message='Bar is prohibited', 
      hint='We do not talk to this guy'; 
    end if; 
exception 
    when sqlstate 'NOBAR' then 
     update nobar_raised set count=count+1; 
end; 

Más información:

+10

Gracias! Funciona con una corrección: el parámetro * errcode * debe tener exactamente cinco dígitos/caracteres ASCII en mayúsculas, de lo contrario causará un error ('código SQLSTATE inválido'). Aquí hay una nota de su enlace: 'Nota: Al especificar un código de error mediante el código SQLSTATE, no está limitado a los códigos de error predefinidos, sino que puede seleccionar cualquier código de error que consta de cinco dígitos y/o letras ASCII en mayúsculas, otros de 00000. Se recomienda que evite arrojar códigos de error que terminen en tres ceros, porque estos son códigos de categoría y solo pueden quedar atrapados atrapando toda la categoría. – Snifff

+0

@Sniff: Gracias - He corregido el caso de los caracteres de errcode – Tometzky

+0

@Tometzky: ¿Qué propiedad bajo el archivo exception.diagnostic muestra 'Bar is prohibited' debajo? ¿Es MESSAGE_TEXT o PG_EXCEPTION_DETAIL o PG_EXCEPTION_HINT? (documentos: http://goo.gl/F5w1y) – obimod

Cuestiones relacionadas