7

Czy można utworzyć niestandardowe warunki, gdy zgłaszam wyjątek? Rozważmy następujący przykład:Warunki niestandardowego wyjątku PostgreSQL

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

Tutaj używam „division_by_zero” warunek złapać wyjątek. Co chciałbym zrobić coś takiego:

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

tak, że nie kolidują z ewentualnymi standardowych wyjątków. Mógłbym po prostu zrobić y: = 1/0; i catch division_by_zero, ale nie wygląda to dobrze.

Odpowiedz

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; 

Więcej informacji:

+10

Dzięki! Działa z jedną poprawką - parametr * errcode * powinien składać się z dokładnie pięciu znaków ASCII, w przeciwnym razie spowoduje błąd ("nieprawidłowy kod SQLSTATE"). Oto uwaga z twojego linku: 'Uwaga: Podczas określania kodu błędu przez kod SQLSTATE, nie jesteś ograniczony do predefiniowanych kodów błędów, ale możesz wybrać dowolny kod błędu składający się z pięciu cyfr i/lub wielkich liter ASCII, innych niż 00000. Zaleca się unikanie rzucania kodów błędów, które kończą się trzema zerami, ponieważ są to kody kategorii i mogą zostać uwięzione jedynie poprzez zalewkowanie całej kategorii. " – Snifff

+0

@Sniff: Dzięki - poprawiłem przypadek znaków errcode – Tometzky

+0

@Tometzky: Która właściwość pod kontrolą wyjątku.diagnostic wyświetla komunikat "Pasek zabroniony"? Czy to MESSAGE_TEXT czy PG_EXCEPTION_DETAIL lub PG_EXCEPTION_HINT? (docs: http://goo.gl/F5w1y) – obimod

Powiązane problemy