2009-09-17 9 views
5

acabo de leer this question, y una solución establece que:¿Qué hay de malo en "Cuando otros luego son nulos" en PL/SQL?

El hecho de que usted no sabe que tiene la excepción NO_DATA_FOUND sugiere que usted ha hecho uno de los mayores errores PL/SQL desarrolladores nunca hacer:

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

¿me podría explicar lo que es el error en esta declaración y qué harías para evitar hacerlo ...

Respuesta

14

El problema es que está detectando todas las excepciones y luego ignorándolas. Nunca sabrás cuando algo salió mal.

+0

Usted quiere decir que la mala práctica aquí no es mediante el uso de "Otros Cuando un valor nulo", pero solamente * * usarlo, es decir, debe de existir la captura de cualquier otra excepción antes? – romaintaz

+1

No, es malo usarlo alguna vez. al MENOS, cuando su cláusula otros debería registrar la excepción en alguna parte. pero lo más probable es que deba iniciar sesión y plantear la excepción –

+3

@Matthew: No estoy de acuerdo. Hay una serie de escenarios perfectamente válidos en los que desearía captar todas las excepciones e ignorarlas. Si los registra o no depende de usted. Estoy de acuerdo en que 9 de cada diez veces querrías hacer algún tipo de logging, pero si estoy haciendo algún tipo de código de mejores esfuerzos en una API de bajo nivel usada con frecuencia, entonces probablemente me saltee los gastos generales de la registración . – darreljnz

1

No hay nada de malo en este fragmento de código si no desea que la excepción del bloque pl/sql se propague más, por ejemplo. Si lo haces a propósito, no es un código erróneo o un error. Esa es la captura todo en pl/sql. Y puede haber situaciones en el código donde haya anidado los bloques BEGIN/EXCEPTION/END y es posible que no desee que la transacción falle solo si falla una sección transversal particular del código. No puede indicar que es una codificación incorrecta si lo hace intencionalmente por cualquier razón/requisito.

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

En la práctica, es muy raro que no se preocupe por ninguna posible excepción. El 99.9% del código "cuando otros no están habilitados" es cuando alguien quiere ignorar un error específico pero es demasiado perezoso para atraparlo correctamente. –

Cuestiones relacionadas