ABAP Objects: Objects: Tutorial Tutorial para para implementar implementar "exceptions "exceptions"" En este Tutorial de ABAP ABAP Objects conoceremos qué es una excepción ("exception") y eremos en qué situaciones coniene usarlas! Adems# aprenderemos a implementarlas en ABAP Objects# y probaremos su uso mediante dos ejemplos# paso a paso! $na Excepci%n (" Exception") es un eento que ocurre durante la ejecuci%n de un pro&rama# que interrumpe el 'lujo normal de las instruccion instrucciones es del mismo# cambiando cambiando su normal compo comportami rtamiento! ento! uando se produc produce e una excepción (usualmente asociada a una condici%n de error)# el pro&rama termina inmediatamente# por lo tanto# es importante que esas situaciones puedan ser manejadas de al&una manera dentro del pro&rama y eitar la cancelaci%n del mismo! encionamos anteriormente que las excepciones usualmente indican una condici%n de error! Por ejemplo# la operaci%n de diisi%n no es posible cuando el divisor es cero ! En tal caso a a ocurrir un error en
tiempo tiemp o de ejecuc ejecución ión# y can cancel celar* ar*a a el pro pro&ra &rama! ma! $n mod modo o de "ma "manej nejar" ar" una exc excepc epci%n i%n dentro dentro del pro&rama y presentar la interrupci%n al usuario de manera "ms ami&able"# podr*a mostrar en este caso un cartel indicando el error del por qué no se puede reali+ar tal operaci%n# y permitir al usuario un nueo in&reso de datos! En este tip eremos c%mo se manejan las excepciones ("exceptions") en ABAP Objects y dos ejemplos donde se codi'ica su uso!
Excepciones en ABAP objects uando se pro&rama en ABAP estructurado # las excepciones se manejan de manera &enérica con el bloque CATCH - ENDCATCH! En particular# si se trata de un error aritmético (por ejemplo la división por
cero)# el error puede ser manejado en ABAP mediante el &rupo de excepciones A!THET!C#EO$! CATCH TCH $%$TE-E&CEPT!ON$ arit'metic-errors( En este caso la instrucci%n a usar ser*a: CA En AB ABAP AP OO# las exc excepc epcion iones es son rep repres resent entada adas s por una insta instancia ncia de una c)ase excep excepción ción! ,os atributos de ese objeto an a contener in'ormaci%n acerca de la situaci%n ocurrida! $na excepci%n puede ser -leantada. con la sentencia A!$E E&CEPT!ON! uando esto ocurre# el sistema busca un manejador manej ador adecuado adecuado que se /a&a car&o# y en el caso de no encontrarlo# encontrarlo# se produce un error en tiemp tiempo o de ejecuci%n! Este manejo se puede llear 0nicamente a cabo si la sentencia que podr*a ocasionar que se leante la excepci%n# se encuentra encerrada por el bloque T%-ENDT% ! El manejo de la excepci%n se reali+a espec*'icamente con la instrucci%n CATCH que se encuentra dentro del bloque! El si&uiente es un c%di&o &enérico que muestra la estrcutura del T%-ENDT% conteniendo conteniendo la AT1 que maneja la excepci%n! s adelante se mostrarn ejemplos concretos donde que utili+an estas sentencias para el manejo de excepciones!
TRY. SENTENCIA_X. CATCH cx_exc_1 CATCH cx_exc_1 INTO ref_exc_1.
… CATCH cx_exc_2 CATCH cx_exc_2 INTO ref_ex_2.
… CLEANU CLE ANUP P.
… ENDTRY. donde:
“$ENTENC!A#&” puede ser una subrutina, un módulo de f unción, un método u otro
objeto que pueda lanzar una o más excepciones. re*#exc#i es una instancia de la clase +cx#exc#i" o de alguna superclase ( “cx#root" por
ejemplo, como se a a er más adelante!. a ejecución del código que puede estar incluido en el bloque C,EANP, se produce cuando el sistema no encuentra un manejador para la excepción que fue leantada (no existe #$%#&! ' se usa en general para "propagar" la excepción, es decir, oler a leantarla. #omo ejemplo, si la “$ENTENC!A#&” leanta la excepción cx#exc#. ' no existe un CATCH para la misma, ejecutará las instrucciones que se encuentren en el bloque #$)*+ siempre ' cuando se cumplan ciertas condiciones 2 $na excepci%n es leantada en el rea prote&ida! 2 ,a excepci%n no es manejada en el bloque T342E56T34 (como se dijo anteriormente)# pero s* en al&0n punto de la jerarqu*a! Tener en cuenta que se puede utili+ar el mismo manejador /CATCH0 para dos excepciones
di*erentes! Entonces# la si&uiente sentencia es lida: CATCH cx-exc- cx-exc-/ !NTO re*#exc(
Ejemplos de manejo de excepciones en ABAP Objects : A continuaci%n mostraremos dos ejemplos de manejo de excepciones! En el primero se a auti)i1ar 2
manejar una excepción de3nida por $AP! En el segundo se crear una nueva c)ase excepción y se an a de'inir al&unos atributos!
jemplo 0iisión por cero Códi4o de) pro4rama de prueba5 *&---------------------------------------------------------------------* *& Include Z_EXCEPCION_PRUEBA_TOP Repor Z_EXCEPCION_PRUEBA *& *&---------------------------------------------------------------------* 1+21% z-excepcion-prueba. %3+4 t'-numero %3+ p )5%& 6 0#78$4 /. 0$%$ resultado %3+ t'-numero, ref-exc %3+ 19 %2 cx-root, msg %3+ string. +$1$8%14 pa-num %3+ t'-numero, pa-num/ %3+ t'-numero.
:;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<: *& Repor Z_EXCEPCION_PRUEBA :;
:;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<: :; :; :;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<: 7)#*0 z-excepcion-prueba-top . ! "lo#$l %$$ T%( resultado = pa-num > pa-num/. ?17% @l resultado es @, resultado. #$%#& cx-s'-zerodiide 7)%2 ref-exc. msg = ref-exc
5otar que el método 4et#text/0 que se utili+% en el ejemplo es el que implementa la claseCOOT de la inter'a+ !7#E$$A8E# el cual es /eredado por toda la cadena de subclases /asta lle&ar a C$%#9EOD!:!DE (er ms abajo jerarqu*a de clases para comprender su comportamiento)!
;0 En cambio# si se comenta el bloque T%-ENDT% y s%lo se deja la sentencia que reali+a la diisi%n# el sistema desple&ar el si&uiente mensaje en tiempo de ejecuci%n cuando el diisor sea cero:
En este caso# el error ocurre porque )a excepción no *ue manejada! El sistema leanta automticamente la excepci%n en la sentencia que reali+a la diisi%n cuando el diisor es cero! Por lo tanto# como no existe un manejador de tal excepci%n (la sentencia no se encuentra encerrada en un bloque tr2-
catc') se produce un error en tiempo de ejecuci%n! 7e puede obserar en el primer paso# c%mo el manejo de la excepci%n lo&r% una interacci%n ms ami&able con el usuario!
Jerarquía de c)ases Exceptions ,a excepción capturada en el ejemplo anterior proiene de una clase standard de 7AP llamada C$%#9EOD!:!DE(
Para visua)i1ar e) arbo) de jerar
)otar que la clase 'ereda de una superc)ase. 4i se Bace doble clicC a la superclaseC$%#A!THET!C#EO, se puede acceder a la misma. 0e esta forma se puede er el árbol jerárquico de Berencia Basta llegar a la clase padre COOT>
jemplo / #reación ' utilización de una clase excepción
Para este ejemplo se a a de'inir una clase PE33O que ten&a como atributos el nombre y peso! 7e desea que el constructor de la clase "leante" una excepci%n cuando se intente instanciar un objeto de la clase PE33O con peso ne4ativo o i4ua) a cero ! 7e mostrar por pantalla dos mensajes di*erentes para cada situación5
n el caso que el nEmero sea ne4ativo el mensaje será “l peso de ?nombre#perro@no puede ser negatio”. n cambio, en el caso que sea igual a cero, el mensaje dirá ?nombre#perro@ no puede no pesar nada" ,ue&o se crear un pro&rama de prueba que maneje dic/as excepciones y en los casos que corresponda# mostrar los mensajes mencionados preiamente!
,os pasos a ))evar a cabo son5 6( 7e crea la clase 9#PEO y se declaran los atributos nombre y peso! ,os tipos asociados son -strin4. y +int;.# respectiamente!
;( En la solapa de +et'ods. se declara el constructor y se de'inen los si&uientes parmetros:
.( Posteriormente# oler a la lista de métodos# seleccionar el constructor y oprimir el bot%n - Exceptions.! 6eclarar la excepci%n 9CPE$O#!N:A,!DO# presionar -Enter. para crearla# y 'inalmente oprimir - $ave. en la entana emer&ente:
( 6entro de la clase 9CPE$O#!N:A,!DO# en la solapa - Texts. de'inir el texto que se muestra a continuaci%n para el 86 9CPE$O#!N:A,!DO (note que el 86 se llama i&ual que la clase y ya iene de'inido)! 8n&resar un nueo 70 llamado 9CPE$O#!N:A,!DO#CEO y completar el texto como se indica:
5otar que en la solapa de atributos se crearon automticamente dos constantes con los nombres de ambos 869s (el que ya estaba de'inido y el que nueo que se de'ini%)# cuyos alores se &eneraron automticamente! A&re&ar el atributo nombre con tipo - strin4.!
( Actiar la clase 9CPE$O#!N:A,!DO ! Posteriormente oler a la clase 9#PEO y escribir el c%di&o para la implementaci%n del método CON$TCTO! Códi4o para )a !mp)ementación de) mtodo CON$TCTO5 8%&20 constructor. 79 i-peso % F. 1$74 G#+%72) %3+ zcx-peso-inalido G+21%7)5 nombre = i-nombre. 479 i-peso H F. 1$74 G#+%72) %3+ zcx-peso-inalido G+21%7)5 textid = zcx-peso-inalido=Azcx-peso-inalido-cero nombre = i-nombre. 4. nombre = i-nombre. peso = i-peso. )079. )08%&20. ( Actiar la clase 9#PEO! A continuaci%n se muestra un pro&rama de prueba que maneja la excepci%n!
Códi4o de) pro4rama de prueba
*&--------------------------------------------------------------------*
REPORT Z_PERRO_PRUEBA.
DATA: un_perro TYPE REF TO Z_PERRO, ref_exc TYPE REF TO cx_root, msg TYPE string.
TRY.
REATE OB!ET un_perro E"PORT#$% i_nom&re ' ()*+( i_peso ' -.
R#TE: ()*+ cre*/o exitos*mente(.
AT0 +cx_peso_in1*2i/o #$TO ref_exc.
msg ' ref_exc34get_text5 6. 7E88A%E msg type (#(.
ENDTRY.
TRY.
REATE OB!ET un_perro E"PORT#$% i_nom&re ' (7i2u( i_peso ' 39-.
R#TE: (7i2u cre*/o exitos*mente(.
AT0 +cx_peso_in1*2i/o #$TO ref_exc.
msg ' ref_exc34get_text5 6. 7E88A%E msg tpe (#(.
ENDTRY.
TRY.
REATE OB!ET un_perro E"PORT#$% i_nom&re ' (Bu/( i_peso ' -.
R#TE: (Bu/ cre*/o exitos*mente(.
AT0 +cx_peso_in1*2i/o #$TO ref_exc.
msg ' ref_exc34get_text5 6. 7E88A%E msg tpe (#(.
ENDTRY.
( Ejecutar el pro&rama y er los mensajes que se muestran por pantalla! Obserar que el Fnico objeto
Consideraciones adicionales para el Ejemplo 2 Anali+ando la implementaci%n del método O57T3$TO3# obserar que en el caso que elpeso sea
ne4ativo# se leant% la excepci%n con la primera instrucci%n A!$E E&CEPT!ONpero no se export% el parmetro +textid. ! Este parmetro toma por de'ault la constante que tiene el mismo nombre que la clase ;PE7O;85