viernes, 27 de julio de 2007

WHEN OTHERS THEN NULL ;

Veo muchas veces a los desarrolladores poniendo en sus códigos...


EXCEPTION
WHEN OTHERS THEN
NULL ;



Las programadores que hacen ésto no estan concientes de sus graves consecuencias.
Un desarrollador JAMAS debe poner código de ese tipo. Porque? Por la simple razón que poniendolo, es como si jamas lo hubieramos puesto. Se entiende? No tiene ningún sentido ponerlo porque no cumple ninguna función. Ahh! Si! Cumple con la función de que si tenemos un error durante la ejecución de nuestro código... jamas nos enteramos; y si nos enteramos de que hubo un error es demasiado difícil encontrarlo.

Veamos un muy sencillo ejemplo:


SQL_9iR2> CREATE OR REPLACE PROCEDURE pr_log_errores
2 (
3 p_cod_error IN VARCHAR2 ,
4 p_msj_error IN VARCHAR2
5 )
6 IS
7 BEGIN
8 INSERT INTO log_errores
9 (
10 fecha ,
11 cod_error,
12 msj_error
13 )
14 VALUES
15 (
16 SYSDATE ,
17 p_cod_error,
18 p_msj_error
19 ) ;
20 COMMIT ;
21 EXCEPTION
22 WHEN OTHERS THEN
23 NULL ;
24 END ;
25 /

Procedure created.

SQL_9iR2> BEGIN
2 pr_log_errores('ORA-00001','unique constraint violated.') ;
3 END ;
4 /

PL/SQL procedure successfully completed.


Como podemos ver, ejecutamos nuestro procedimiento de prueba y terminó perfectamente... pero, realmente terminó bien? Veamos...


SQL_9iR2> SELECT *
2 FROM log_errores ;

no rows selected


Aha! El procedimiento no insertó en la tabla de logueo el error que le pasamos como parámetro. Pero como puede ser esto posible?


SQL_9iR2> DESC log_errores
Name Null? Type
------------------ -------- -------------
FECHA DATE
COD_ERROR VARCHAR2(100)
MSJ_ERROR VARCHAR2(10)


El campo MSJ_ERROR tiene una longitud de 10 caracteres y nosotros queremos introducir una cadena más larga. Nosotros nunca nos enteramos de que hubo un error.
Imaginense si es un proceso Batch crítico que se ejecuta todos los días de forma automática durante la madrugada. Si ocurre algún error... nadie se podría dar cuenta que el proceso en algún punto falló.

Corregimos nuestro procedimiento...


SQL_9iR2> CREATE OR REPLACE PROCEDURE pr_log_errores
2 (
3 p_cod_error IN VARCHAR2 ,
4 p_msj_error IN VARCHAR2
5 )
6 IS
7 BEGIN
8 INSERT INTO log_errores
9 (
10 fecha ,
11 cod_error,
12 msj_error
13 )
14 VALUES
15 (
16 SYSDATE ,
17 p_cod_error,
18 p_msj_error
19 ) ;
20 COMMIT ;
21 EXCEPTION
22 WHEN OTHERS THEN
23 RAISE ;
24 END ;
25 /

Procedure created.

SQL_9iR2> BEGIN
2 pr_log_errores('ORA-00001','unique constraint violated.') ;
3 END ;
4 /
BEGIN
*
ERROR at line 1:
ORA-01401: inserted value too large for column
ORA-06512: at "IP_UTILS.PR_LOG_ERRORES", line 24
ORA-06512: at line 2

1 comentario:

Joaquin dijo...

Hola, soy un oracle developer (muy muy muy muy junior xD) y entre de casualidad a tu blog y la verdad que buscando otra cosa resolvi mi duda en tu blog.
Sea como sea, te felicito por el blog y de alguna manera "gracias"
Saludos, Joako!