Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

348
Views
En ABAP, ¿cuál es el equivalente de la palabra clave finalmente de Java?

En Java, la palabra clave finally se usa para ejecutar código (se usa con excepciones: instrucciones try..catch ) sin importar si se lanza una excepción o no ( fuente ).

Por ejemplo:

 try { // this code might throw an exception riskyCall(); // this code will only run if no exception was thrown above mainProgram(); } finally { // this code will always run cleanUp(); }

¿Existe una función equivalente en ABAP? Si no, ¿cuál es una forma idiomática de implementar la misma funcionalidad?

Sé que ABAP tiene una palabra clave CLEANUP , pero parece que solo se ejecuta si se lanza una excepción.

Experimenté y encontré lo siguiente como una posible solución. Desafortunadamente, no puedo pensar en ninguna solución sin duplicación de código.

 METHOD risky_method. TRY. WRITE 'code before...'. IF lv_error_condition = abap_true. RAISE EXCEPTION TYPE cx_foo. ENDIF. WRITE 'Main program...'. WRITE 'Cleanup...'. CLEANUP. WRITE 'Cleanup...'. ENDTRY. ENDMETHOD. METHOD outer_scope. TRY. risky_method( ). CATCH cx_foo INTO DATA(lx_foo). WRITE 'Caught the error!'. ENDTRY. ENDMETHOD.

Para el caso en que lv_error_condition igual a abap_false , el resultado de ejecutar el método outer_scope es:

 code before... Main program... Cleanup...

Para el caso en que lv_error_condition igual a abap_true , el resultado es:

 code before... Cleanup... Caught the error!

Esta solución tiene la ventaja de que la limpieza siempre se ejecuta. Tiene la desventaja de que se requiere cierta duplicación de código, ya que la limpieza debe escribirse dos veces. Si la limpieza está empaquetada en un método, entonces no es una cantidad terrible de duplicación de código. :-/

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

ABAP no tiene un equivalente exacto para el bloque java finally .

Existe la construcción TRY ... CLEANUP que parece similar a primera vista pero en realidad funciona de manera muy diferente:

 METHOD buggy_method. TRY. WRITE 'code before the error...'. RAISE EXCEPTION TYPE cx_foo. WRITE 'This line will not get executed.'. CLEANUP. WRITE 'Cleanup...'. ENDTRY. ENDMETHOD. " ...on an outer scope... TRY. buggy_method( ). CATCH cx_foo INTO DATA(lx_foo). WRITE 'Caught the error!'. ENDTRY.

Salida: code before the error... Cleanup... Caught the error!

Sin embargo, el bloque de limpieza no siempre* se ejecuta. Solo se ejecuta cuando hay una excepción y esa excepción no es manejada por CATCH en el mismo bloque TRY . La idea es usarlo para limpiezas que se supone que suceden cuando un bloque TRY maneja una excepción en un nivel externo. Por lo tanto, no es útil para el código que desea ejecutar independientemente de si tiene un error o no. Solo es útil para el código que desea ejecutar en caso de un error que el bloque de prueba no maneja por sí mismo.


Otra característica que cubre algunos de los casos de uso del bloque finally de Java son las excepciones reanudables :

 " In the class definiton METHODS buggy_method RAISING RESUMABLE(cx_foo). " In the class implementation: METHOD buggy_method. WRITE 'code before the error...'. RAISE RESUMABLE EXCEPTION TYPE cx_foo. WRITE 'code after the error....'. ENDMETHOD. " Somewhere else: TRY. buggy_method( ). CATCH BEFORE UNWIND cx_foo INTO DATA(lx_foo). WRITE 'Caught the error!'. RESUME. ENDTRY.

Salida: code before the error... Caught the error! code after the error....

La palabra clave RESUME al final del bloque CATCH hace que la ejecución continúe justo después de que la excepción fuera RAISE RESUMABLE d. Entonces, cuando quiera asegurarse de que el final de su método se ejecute incluso en caso de error, entonces esta es quizás la sintaxis que está buscando.

* sí, sé que hay casos extremos exóticos en los que un bloque finalmente en Java no se ejecuta. Esos no son relevantes aquí.

over 4 years ago · Santiago Trujillo Report

0

Un colega me dio la solución. El truco para evitar la duplicación de código, y al mismo tiempo permitir que la excepción se propague hacia arriba, es no usar la palabra clave CLEANUP en absoluto y, en su lugar:

  1. Después del código arriesgado, captura la excepción CX_ROOT (para capturar todas las excepciones posibles, ¡no solo las que esperas!)
  2. Ejecute el código de limpieza de estilo finally
  3. Use IS BOUND para ver si se generó una excepción y, en caso afirmativo, vuelva a generarla

Aquí hay un ejemplo:

 METHOD risky_method. TRY. WRITE 'code before...'. IF lv_error_condition = abap_true. RAISE EXCEPTION TYPE cx_foo. ENDIF. WRITE 'Main program...'. CATCH cx_root INTO DATA(lx_root). ENDTRY. WRITE 'Cleanup...'. IF lx_root IS BOUND. RAISE lx_root. ENDIF. ENDMETHOD. METHOD outer_scope. TRY. risky_method( ). CATCH cx_foo INTO DATA(lx_foo). WRITE 'Caught the error!'. ENDTRY. ENDMETHOD.

Para el caso en que lv_error_condition igual a abap_false , el resultado es:

 code before... Main program... Cleanup...

Para el caso en que lv_error_condition igual a abap_true , el resultado es:

 code before... Cleanup... Caught the error!
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!