SAP ABAP: manejo de excepciones
Un exceptiones un problema que surge durante la ejecución de un programa. Cuando ocurre una excepción, el flujo normal del programa se interrumpe y la aplicación del programa finaliza de manera anormal, lo cual no se recomienda, por lo tanto, estas excepciones deben manejarse.
Las excepciones proporcionan una forma de transferir el control de una parte de un programa a otra. El manejo de excepciones ABAP se basa en tres palabras clave: RAISE, TRY, CATCH y CLEANUP. Suponiendo que un bloque generará una excepción, un método detecta una excepción utilizando una combinación de las palabras clave TRY y CATCH. Un bloque TRY - CATCH se coloca alrededor del código que podría generar una excepción. A continuación se muestra la sintaxis para usar TRY - CATCH -
TRY.
Try Block <Code that raises an exception>
CATCH
Catch Block <exception handler M>
. . .
. . .
. . .
CATCH
Catch Block <exception handler R>
CLEANUP.
Cleanup block <to restore consistent state>
ENDTRY.
RAISE- Se plantean excepciones para indicar que ha ocurrido alguna situación excepcional. Por lo general, un controlador de excepciones intenta reparar el error o encontrar una solución alternativa.
TRY- El bloque TRY contiene la codificación de la aplicación cuyas excepciones se van a manejar. Este bloque de instrucciones se procesa secuencialmente. Puede contener más estructuras de control y llamadas de procedimientos u otros programas ABAP. Le sigue uno o más bloques de captura.
CATCH- Un programa detecta una excepción con un controlador de excepciones en el lugar de un programa en el que desea manejar el problema. La palabra clave CATCH indica la captura de una excepción.
CLEANUP- Las sentencias del bloque CLEANUP se ejecutan siempre que ocurre una excepción en un bloque TRY que no es detectado por el manejador de la misma construcción TRY - ENDTRY. Dentro de la cláusula CLEANUP, el sistema puede restaurar un objeto a un estado consistente o liberar recursos externos. Es decir, el trabajo de limpieza se puede ejecutar para el contexto del bloque TRY.
Generación de excepciones
Las excepciones se pueden generar en cualquier punto de un método, un módulo de función, una subrutina, etc. Hay dos formas de generar una excepción:
Excepciones planteadas por el sistema de tiempo de ejecución ABAP.
Por ejemplo, Y = 1 / 0. Esto resultará en un error de tiempo de ejecución de tipo CX_SY_ZERODIVIDE.
Excepciones planteadas por el programador.
Levante y cree un objeto de excepción simultáneamente. Genere una excepción con un objeto de excepción que ya existe en el primer escenario. La sintaxis es: RAISE EXCEPTION exep.
Captura de excepciones
Los controladores se utilizan para detectar excepciones.
Echemos un vistazo a un fragmento de código:
DATA: result TYPE P LENGTH 8 DECIMALS 2,
exref TYPE REF TO CX_ROOT,
msgtxt TYPE STRING.
PARAMETERS: Num1 TYPE I, Num2 TYPE I.
TRY.
result = Num1 / Num2.
CATCH CX_SY_ZERODIVIDE INTO exref.
msgtxt = exref→GET_TEXT( ).
CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref.
msgtxt = exref→GET_TEXT( ).
En el fragmento de código anterior, estamos tratando de dividir Num1 por Num2 para obtener el resultado en una variable de tipo flotante.
Se pueden generar dos tipos de excepciones.
Error de conversión de números.
Dividir por excepción cero. Los controladores detectan la excepción CX_SY_CONVERSION_NO_NUMBER y también la excepción CX_SY_ZERODIVIDE. Aquí, el método GET_TEXT () de la clase de excepción se usa para obtener la descripción de la excepción.
Atributos de las excepciones
Aquí están los cinco atributos y métodos de excepciones:
S.No. | Atributo y descripción |
---|---|
1 | Textid Se usa para definir diferentes textos para excepciones y también afecta el resultado del método get_text. |
2 | Previous Este atributo puede almacenar la excepción original que le permite construir una cadena de excepciones. |
3 | get_text Esto devuelve la representación textual como una cadena según el idioma del sistema de la excepción. |
4 | get_longtext Esto devuelve la variante larga de la representación textual de la excepción como una cadena. |
5 | get_source_position Da el nombre del programa y el número de línea alcanzado donde se generó la excepción. |
Ejemplo
REPORT ZExceptionsDemo.
PARAMETERS Num_1 TYPE I.
DATA res_1 TYPE P DECIMALS 2.
DATA orf_1 TYPE REF TO CX_ROOT.
DATA txt_1 TYPE STRING.
start-of-selection.
Write: / 'Square Root and Division with:', Num_1.
write: /.
TRY.
IF ABS( Num_1 ) > 150.
RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE.
ENDIF.
TRY.
res_1 = SQRT( Num_1 ).
Write: / 'Result of square root:', res_1.
res_1 = 1 / Num_1.
Write: / 'Result of division:', res_1.
CATCH CX_SY_ZERODIVIDE INTO orf_1.
txt_1 = orf_1→GET_TEXT( ).
CLEANUP.
CLEAR res_1.
ENDTRY.
CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1.
txt_1 = orf_1→GET_TEXT( ).
CATCH CX_ROOT INTO orf_1.
txt_1 = orf_1→GET_TEXT( ).
ENDTRY.
IF NOT txt_1 IS INITIAL.
Write / txt_1.
ENDIF.
Write: / 'Final Result is:', res_1.
En este ejemplo, si el número es mayor que 150, se genera la excepción CX_DEMO_ABS_TOO_LARGE. El código anterior produce la siguiente salida para el número 160.
Square Root and Division with: 160
The absolute value of number is too high
Final Result is: 0.00