17 September 2006

Propagation Of Exceptions In PL/SQL

Birçok dilde olduğu gibi PL/SQL'de de exception handling üzerinde dikkatle durulması gereken bir olaydır. Bu hem son kullanıcıları hem de uygulama geliştiricileri yakından ilgilendirir. Son kullanıcıya uygun mesajın gösterilmesi, hata içeriğine dair detaylı bilgilerin uygulama geliştiricilere bildirilmesi gerekir.

Birçok programlama dili exception handling i try catch blokları ile aşmaya çalışır. PL/SQL'de bu durum için exception blokları yazılır, hangi exception oluşmuşsa ona göre reaksiyon alınması sağlanır. Oluşan exception en iç bloktan en dış bloğa doğru fırlatılır. İlk bulunan exception bloğu içinde bu exception unun handle edilip edilmediğine bakılır. Eğer o exception için bir mekanizma yoksa ve global(others) bir mekanizma da tanımlı değilse bir üst bloğa doğru hareket eder. Eğer bir yerde handle edildiyse, ondan sonraki bloktan akış devam eder.

Aşağıda bu durumu modelleyen bir senaryo bulunmaktadır. İçiçe bulunan 4 blok içinden exceptionlar oluşturulmuş, bunların fırlatılma durumları gözlenmiştir.


DECLARE
  custom_exc EXCEPTION;
  i NUMBER;
BEGIN
  dbms_output.put_line('Program Start');

  <>
  BEGIN
    dbms_output.put_line('<>Start');
 
    <>
    BEGIN
      dbms_output.put_line('    <>Start');
   
      <>
      BEGIN
        dbms_output.put_line('        <>Just Before custom_exc');
        RAISE custom_exc;
        dbms_output.put_line('        <>Just After custom_exc');
      EXCEPTION
        WHEN zero_divide THEN
          dbms_output.put_line('        <>Divide by zero exception occured!!!');
        WHEN OTHERS THEN
          dbms_output.put_line('        <>Others exception occured!!!');
      END inner_in_label;
   
      dbms_output.put_line('    <>Just Before zero_divide');
      i := 3 / 0;
      dbms_output.put_line('    <>Just After zero_divide');
      dbms_output.put_line('    <>End');
   
    EXCEPTION
      WHEN custom_exc THEN
        dbms_output.put_line('    <>custom_exc exception occured!!!');
      WHEN zero_divide THEN
        dbms_output.put_line('    <>zero_divide');
     
    END inner_label;
 
    dbms_output.put_line('<>End');
 
  END outer_label;
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line('Others exception occured!!!');
 
END;


Çıktı ise şöyledir:

Program Start
<>Start
    <>Start
        <>Just Before custom_exc
        <>Others exception occured!!!
    <>Just Before zero_divide
    <>zero_divide
<>End

No comments: