Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

347
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda