2009-09-17 4 views
5

Właśnie przeczytałem this question, a rozwiązanie stwierdza, że:Co jest złego w "When Others Then Null" w języku PL/SQL?

Fakt, że nie wiesz, masz wyjątek NO_DATA_FOUND sugeruje które zostały wykonane jeden z największych deweloperów błędów PL/SQL kiedykolwiek Marka:

EXCEPTION 
    -- Never do this in real code!!! 
    WHEN OTHERS THEN NULL; 
END; 

mógłbyś mi wyjaśnić, co jest w tym stwierdzeniu błędu i co zrobić, aby uniknąć robi to ...

Odpowiedz

14

Problem polega na tym, że przechwytujesz wszystkie wyjątki, a następnie je ignorujesz. Nigdy nie dowiesz się, kiedy coś poszło nie tak.

+0

To znaczy, że zła praktyka nie jest tu za pomocą „Kiedy inni Następnie Null”, ale * tylko * go używać, to znaczy whitout łapania jakikolwiek inny wyjątek wcześniej? – romaintaz

+1

Nie, źle go używać. w najgorszym przypadku, twoja, gdy inne klauzule powinny gdzieś zalogować się do wyjątku. ale najprawdopodobniej powinieneś się zalogować i zgłosić wyjątek –

+3

@Matthew: Nie zgadzam się. Istnieje kilka doskonale poprawnych scenariuszy, w których chciałbyś wychwycić wszystkie wyjątki i zignorować je. To, czy je rejestrujesz, czy nie, zależy od Ciebie. Zgadzam się, że 9 razy na dziesięć chciałbyś zrobić jakieś logowanie, ale jeśli robię jakiś kod best-effort w często używanym, niskim poziomie API to prawdopodobnie pominęłbym koszty rejestrowania . – darreljnz

1

Nie ma nic złego w tym fragmencie kodu, jeśli nie chcesz, aby wyjątek bloku pl/sql był dalej propagowany na przykład. Jeśli zrobisz to celowo, nie jest to zły kod ani błąd. To jest haczyk w całości w pl/sql. A w kodzie mogą znajdować się sytuacje, w których masz zagnieżdżone bloki BEGIN/EXCEPTION/END i jedna może nie chcieć, aby transakcja zawodziła, tylko jeśli określony przekrój kodu nie powiedzie się. Nie możesz podać jej złego kodowania, jeśli robisz to celowo z jakiegokolwiek powodu/wymogu.

BEGIN 

    --something important here 

    --something even more important here 

    BEGIN 
    --something secondary goes here but not important enough to stop the process or 
    --log a message about it either 
    --maybe send an informative email to the support group or 
    --insert a log message when debugging the process or 
    --the list could go on and on here 
    EXCEPTION 
    --I don't care if this block fails, absorbing all errors regardless of type 
    WHEN OTHERS THEN NULL; 
    END; 

    -- something super important here, must happen 

EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    -- do something useful for this exception 
    WHEN OTHERS THEN 
    -- do something by default if we don't expect this error 
END; 
+2

W praktyce bardzo rzadko zdarza się, że nie obchodzi go żaden możliwy wyjątek. 99,9% kodu 'gdy inne niż zero 'występuje wtedy, gdy ktoś chce zignorować jeden konkretny błąd, ale jest zbyt leniwy, aby go poprawnie złapać. –