7

È possibile creare condizioni personalizzate quando si alza un'eccezione? consideri il seguente esempio:Condizioni di eccezione personalizzate PostgreSQL

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

Qui uso condizione 'division_by_zero' per catturare l'eccezione. Quello che mi piacerebbe fare è qualcosa di simile:

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

in modo che non interferiscano con possibili eccezioni standard. Potrei fare y: = 1/0; e cattura division_by_zero, ma non sembra giusto.

risposta

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; 

Maggiori informazioni:

+10

Grazie! Funziona con una correzione: il parametro * errcode * deve essere composto da cinque caratteri ASCII maiuscoli/minuscoli, altrimenti causerà un errore ('codice SQLSTATE non valido'). Ecco una nota dal tuo link: 'Nota: quando si specifica un codice di errore tramite codice SQLSTATE, non si è limitati ai codici di errore predefiniti, ma è possibile selezionare qualsiasi codice di errore composto da cinque cifre e/o lettere ASCII maiuscole, altro di 00000. Si consiglia di evitare di lanciare codici di errore che terminano in tre zeri, poiché si tratta di codici di categoria e possono essere intrappolati solo intrappolando l'intera categoria. – Snifff

+0

@Sniff: Grazie - Ho corretto il caso di caratteri errcode – Tometzky

+0

@Tometzky: quale proprietà sotto l'eccezione.diagnostic fa 'Bar vietato' mostrare sotto? È MESSAGE_TEXT o PG_EXCEPTION_DETAIL o PG_EXCEPTION_HINT? (documenti: http://goo.gl/F5w1y) – obimod