Analyzing Runtime Errors

Objective

After completing this lesson, you will be able to analizar errores de tiempo de ejecución

Dump breve ABAP

La necesidad de debugging

No hay ningún modo de solucionar el hecho de que se produzcan errores en programas. Sin embargo, estos se manifiestan de distintas maneras. Cuando un usuario inicia una aplicación errónea, puede fallar, puede suceder algo inesperado o puede que no suceda nada. Desde el punto de vista del usuario, a nivel de interfaz de usuario, es imposible decir cómo y por qué se produjo el error.

Como desarrollador, ahora debe examinar el programa más detenidamente, línea por línea de hecho, para establecer exactamente qué sentencias y combinaciones de valores en las diferentes variables de programa han causado el error. Aquí es donde entra el Debugger.

Errores en tiempo de ejecución

Código ABAP que contiene una sentencia que dividirá por cero

Es importante realizar una verificación de sintaxis regularmente al escribir el código ABAP. Sin embargo, la sintaxis correcta no siempre significa que su programa se ejecutará correctamente en el tiempo de ejecución.

Por ejemplo, los cálculos en su programa pueden causar un problema en función de los valores utilizados. La imagen "Un programa sintácticamente correcto puede tener problemas" muestra un programa que, si bien es sintácticamente correcto, provocará un error en tiempo de ejecución.

Dump breve ABAP

Captura de pantalla de un dump breve con información sobre el error

Si el entorno de tiempo de ejecución encuentra una sentencia que no se puede ejecutar, cancela el programa y desencadena un error de tiempo de ejecución. Cada error de tiempo de ejecución se identifica con un nombre y se asigna a una situación de error específica. El entorno de tiempo de ejecución cancela el programa si no se intercepta un error de tiempo de ejecución. El error de tiempo de ejecución ABAP se puede visualizar en el ABAP Runtime Error Viewer a partir de ABAP 7.53.

El ABAP Runtime Error Viewer se puede abrir utilizando diferentes puntos de entrada:

  • Si el error se produce al ejecutar la aplicación ABAP, aparecerá un diálogo en la esquina inferior derecha. Seleccione Mostrar para visualizar el error.
  • En la vista Lector de feeds, haga doble clic en la entrada de error de tiempo de ejecución.

Desde la barra de herramientas, puede navegar a la posición del código fuente donde se produjo el volcado y compartir el enlace al volcado.

Captura de pantalla de los botones Navegar al código fuente y Compartir enlace a volcado
Captura de pantalla del menú contextual después de hacer clic con el botón derecho en el código fuente en el dump breve

Hay tres pestañas en la parte inferior del editor:

  1. La primera proporciona la siguiente información:

    • Información de cabecera
    • Análisis de errores
    • Información sobre dónde se ha cancelado el programa
    • Extracto de código fuente
    • Se resalta la línea en la que se ha producido el error; seleccione la línea para navegar al error en el código fuente
    • Llamadas/eventos activos
  2. La pestaña Texto explicativo proporciona la información completa del volcado. Admite las funciones Esquema y Esquema rápido (Ctrl+ O en el teclado).

  3. La ficha Visualización sin formato proporciona la información de volcado en un formato técnico que solo es necesario para situaciones de análisis especiales.

Un dump breve también le permite navegar directamente al ABAP Debugger para ver los valores de las variables justo antes de que se haya producido el error de tiempo de ejecución.

Los errores de tiempo de ejecución son normales. Probablemente los encontrará con frecuencia mientras desarrolla sus programas. Sin embargo, es importante que intente prevenirlos. Un usuario de su sistema de producción puede estar confundido si ve un error en tiempo de ejecución, como el error de la figura. Es posible que el usuario no entienda una referencia a la aplicación ABAP y la información técnica presentada.

Evitar errores de tiempo de ejecución

Diagrama que muestra el flujo lógico de un método con ramificación condicional para evitar un dump breve
Implementación de ejemplo de un método con ramificación condicional para evitar un dump breve

En el ejemplo anterior, se ha añadido la lógica para evitar la división por un error de tiempo de ejecución cero.

Utilizar la lógica condicional para evitar un error en tiempo de ejecución

Ejemplo empresarial

Uno de sus colegas ha creado un programa que calcula el número medio de días de vacaciones restantes para cada mes restante del año. Otro colega mencionó que el programa se desempeña extrañamente cuando no quedan meses en el año. Pruebe el programa y realice las modificaciones necesarias para asegurarse de que funciona en todas las circunstancias.

Nota

En este ejercicio XX hace referencia a su número.

Pasos

  1. En su paquete, cree una nueva clase ABAP con el nombre ZCL_XX_DUMP. Asegúrese de que utiliza la interfaz IF_OO_ADT_CLASSRUN. Cuando se le solicite que asigne la clase a una orden de transporte, utilice la orden de transporte que ha creado en la tarea anterior.

    1. Seleccione FicheroNuevaclase ABAP.

    2. Introduzca el paquete ZS4D100_XX

    3. Introduzca el nombre ZCL_XX_DUMP e introduzca una descripción para su clase.

    4. Seleccione Añadir... (junto al marco de grupo Interfaces).

    5. Introduzca el texto de filtro IF_OO_ADT_CLASSRUN. Haga doble clic en la entrada coincidente en la lista de aciertos.

    6. Seleccione Siguiente.

    7. Seleccione Seleccionar de las órdenes en las que estoy implicado y su propia orden de transporte.

    8. Seleccione Finalizar.

  2. En if_oo_adt_classrun~main( ) añada el siguiente código:

    1. En el editor, introduzca la siguiente codificación entre METHOD if_oo_adt_classrun~main y ENDMETHOD.

      Code Snippet
      123456
      DATA: lv_mths TYPE i VALUE 10, "No. of months remaining in year lv_hols TYPE i VALUE 20, "No. of days untaken vacation lv_avg_hols TYPE i. lv_avg_hols = lv_hols / lv_mths. out->write( |Average vacation days per month { lv_avg_hols }| ).
  3. Active y pruebe su clase.

    1. Active la clase con el acceso directo de teclado Ctrl + F3.

    2. Ejecute la clase con la tecla F9.

    Resultado

    El programa emite el promedio de días de vacaciones restantes por mes.
  4. Modifique el programa Test, verifique el resultado si quedan 0 meses en el año y el empleado tiene 20 días de vacaciones no utilizados.

    1. Fije el valor de lv_mths en 0.

    2. Seleccione Activar (Ctrl+F3).

    3. Ejecute el programa seleccionando F9.

    Resultado

    El programa se cancela y visualiza los detalles de un error de tiempo de ejecución.
  5. Analice el error de tiempo de ejecución para identificar el problema. ¿Por qué se ha producido el error?

    1. Ejecute el programa seleccionando F9.

    2. Eclipse mostrará una ventana emergente en la parte inferior derecha con el título Error de tiempo de ejecución ABAP.

    3. Haga clic en el enlace Mostrar para analizar el error.

    4. Desplácese hacia abajo para ver qué ocurrió y qué línea causó el error.

    El error se ha producido porque matemáticamente es imposible dividir por cero.

  6. Cambie al Editor ABAP.

    1. Seleccione la etiqueta ZCL_S4D100_XX_DUMP.

  7. Para evitar que se produzca el error de tiempo de ejecución, implemente una condición para que el programa emita el siguiente texto si no quedan meses: Pregunte si puede prorrogar sus vacaciones restantes. De lo contrario, realice el cálculo y emita el resultado como antes.

    1. Añada el siguiente código alrededor del cálculo existente:

      Code Snippet
      123456
      IF lv_mths NE 0. lv_avg_hols = lv_hols / lv_mths. out->write( |Average vacation days per month { lv_avg_hols }| ). ELSE. out->write( |Please ask to roll over remaining vacation| ). ENDIF.
    2. Ahora, active y pruebe el programa.

      Code Snippet
      1234567891011121314151617181920212223242526
      * Full Solution Code CLASS zcl_s4d100_dump DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_oo_adt_classrun . PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS zcl_s4d100_dump IMPLEMENTATION. METHOD if_oo_adt_classrun~main. DATA: lv_mths TYPE i VALUE 0, "No. of months remaining in year lv_hols TYPE i VALUE 10, "No. of days untaken vacation lv_avg_hols TYPE i. IF lv_mths <> 0. lv_avg_hols = lv_hols / lv_mths. out->write( |Average vacation days per month { lv_avg_hols }| ). ELSE. out->write( |Please ask to roll over remaining vacation!| ). ENDIF. ENDMETHOD. ENDCLASS.

      Practicar