2014-12-19 26 views
21

Bu çok sık sorulan bir sorudur. Yığın akışında herhangi bir kopya bulamadığım için referans olarak göndermeyi düşündüm.PL/SQL istisna işleme: Hiçbir şey yapma (istisna yoksay)

Soru: PL/SQL'de, yakalandıklarında kural dışı durumların nasıl yakalanacağını ve kodun yürütüleceğini ve bunları çağrı bloğuna nasıl yayılacağını biliyorum. Diğer tüm istisnalar çağıran bloğuna yetiştirilir ederken Örneğin, aşağıdaki prosedürde, NO_DATA_FOUND istisna doğrudan işlenir:

CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
IS 
BEGIN 
    do_stuff(); 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     -- Do something 
     handle_exception(); 

    WHEN OTHERS THEN 
     -- Propagate exception 
     RAISE; 
END; 

Ama bir veya tüm yükseltilmiş istisnalar göz ardı ederek yürütme dönmek için kullanması gereken hangi komut çağrı bloğuna geri dönün?

cevap

37

Zamanın% 99'unun, en azından onları bir yerde oturum açmaksızın istisnaları sessizce görmezden gelmek için kötü bir uygulama olduğunu kabul etmeme rağmen, bunun kesinlikle kabul edilebilir olduğu özel durumlar vardır.

1) Kişisel kodu bazen başarısız olur biliyor deyimi ve seni içerir: görmezden istisnalar arzu edilebilir

[...] 
EXCEPTION 

    WHEN OTHERS THEN 
     NULL; 
END; 

İki tipik durumlar şunlardır: Bu durumlarda

, BOŞ senin arkadaşın Bu gerçeğin program akışını kesmesini istemiyorum. Aşağıdaki örnekte gösterildiği gibi bu durumda , sen iç içe bir blokta size deyimi içine olmalıdır:

CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
IS 
    l_empoyee_name EMPLOYEES.EMPLOYEE_NAME%TYPE; 
BEGIN 
    -- Catch potential NO_DATA_FOUND exception and continue 
    BEGIN 
     SELECT EMPLOYEE_NAME 
     INTO l_empoyee_name 
     FROM EMPLOYEES 
     WHERE EMPLOYEE_ID = 12345; 
    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      NULL; 
     WHEN OTHERS THEN 
      RAISE; 
    END; 

    do_stuff(); 

EXCEPTION 

    WHEN OTHERS THEN 
     -- Propagate exception 
     RAISE; 
END; 

PL/SQL genellikle On Error Resume Görsel bilinen istisna işleme Sonraki tip izin vermez Not olduğunu Tüm istisnaların dikkate alınmadığı ve programın hiçbir şey olmamış gibi çalışmaya devam ettiği temel (bkz. On error resume next type of error handling in PL/SQL oracle). Yuvalanmış bir blokta potansiyel olarak başarısız olan ifadeleri açıkça eklemeniz gerekir. 2) Prosedürünüz o kadar önemli değildir ki, attığı tüm özel durumları göz ardı etmek, ana program mantığınızı etkilemeyecektir. (Ancak, bu çok nadiren böyledir ve genellikle uzun vadede bir ayıklama kabus neden olabilir)

BEGIN 

    do_stuff(); 

EXCEPTION 

    WHEN OTHERS THEN 
     -- Ignore all exceptions and return control to calling block 
     NULL; 
END; 
+3

Belki de "başkaları null" olduğunda, bir adımın işe yarayıp yaramadığını gerçekten umursamadığınız çok özel bloklar dışında ve "başkaları arttığında" sadece hata hakkında bilgi atarsa, kötü uygulama olarak nitelendirilmeye değer. . –

1

o anlamda sessizce istisna görmezden yapar başka senaryo: Eğer beklenen bir komut dosyası çağırdığınızda Varsa, bir nesne oluşturmak ve bu nesne için bir oluştur ya da değiştir sözdizimi yok. PLSQL nesneleri bir create-or-replace sözdizimine sahiptir, ancak tablolar ve dizinler yoktur. Ardından, bu komut dosyalarını bir bloğa koyabiliriz ve yükseltilen istisnayı yok sayabiliriz.