Analyzing Runtime Errors

Objective

After completing this lesson, you will be able to analyser les erreurs d'exécution

Vidage d'une partie de la mémoire ABAP

Le besoin de débogage

Il n'y a aucun moyen de contourner le fait que des erreurs se produisent dans les programmes. Cependant, ils se manifestent de différentes manières. Lorsqu'un utilisateur démarre une application défectueuse, il se peut qu'elle tombe en panne, que quelque chose d'inattendu se produise ou que rien ne se produise. Du point de vue de l'utilisateur, au niveau de l'interface utilisateur, il est impossible de dire exactement comment et pourquoi cette erreur s'est produite.

En tant que développeur, vous devez maintenant examiner le programme de plus près, ligne par ligne en fait, pour établir exactement quelles instructions et combinaisons de valeurs dans les différentes variables de programme ont causé l'erreur. C'est là qu'intervient le débogueur.

Erreurs d'exécution

Code ABAP contenant une instruction qui divise par zéro

Il est important d'effectuer régulièrement un contrôle syntaxique lors de l'écriture du code ABAP. Cependant, une syntaxe correcte ne signifie pas toujours que votre programme s'exécutera correctement au moment de l'exécution.

Par exemple, les calculs dans votre programme peuvent entraîner un problème en fonction des valeurs utilisées. La figure, Un programme Syntaxiquement correct peut avoir des problèmes, montre un programme qui, bien que syntaxiquement correct, provoquera une erreur d'exécution.

Vidage d'une partie de la mémoire ABAP

Capture d'écran d'un vidage d'une partie de la mémoire avec des informations sur l'erreur

Si l'environnement d'exécution rencontre une instruction qui ne peut pas être exécutée, il interrompt le programme et déclenche une erreur d'exécution. Chaque erreur d'exécution est identifiée par un nom et affectée à une situation d'erreur spécifique. L'environnement d'exécution interrompt le programme si une erreur d'exécution n'est pas interceptée. L'erreur d'exécution ABAP peut être affichée dans le visualiseur des erreurs d'exécution ABAP à partir de ABAP 7.53.

Le visualiseur des erreurs d'exécution ABAP peut être ouvert à l'aide de différents points d'entrée :

  • Si l'erreur survient lors de l'exécution de l'application ABAP, une boîte de dialogue apparaît dans le coin inférieur droit. Sélectionnez Afficher pour afficher l'erreur.
  • Dans la vue Lecteur de flux, double-cliquez sur l'entrée d'erreur d'exécution.

Depuis la barre d'outils, vous pouvez accéder à la position du code source où le vidage de la mémoire s'est produit et partager le lien vers le vidage de la mémoire.

Capture d'écran des boutons « Naviguer vers le code source » et « Partager le lien vers le vidage »
Capture d'écran du menu contextuel après un clic droit sur le code source dans le vidage d'une partie de la mémoire

Il existe trois onglets en bas de l'éditeur :

  1. Le premier fournit les informations suivantes :

    • Informations d’en-tête
    • Analyse des erreurs
    • Informations sur l'endroit où le programme s'est terminé
    • Extrait de code source
    • La ligne dans laquelle l'erreur s'est produite est mise en surbrillance. Sélectionnez la ligne pour accéder à l'erreur dans le code source.
    • Appels/événements actifs
  2. L'onglet Texte descriptif fournit l'intégralité des informations de vidage de la mémoire. Il prend en charge les fonctionnalités, Structure et Structure rapide (Ctrl + O sur votre clavier).

  3. L'onglet Affichage non formaté fournit les informations de vidage de la mémoire dans un format technique qui n'est nécessaire que pour des situations d'analyse spéciales.

Un vidage d'une partie de la mémoire vous permet également d'accéder directement à l'ABAP Debugger pour afficher les valeurs des variables juste avant la survenue de l'erreur d'exécution.

Les erreurs d'exécution sont normales. Vous les rencontrerez probablement fréquemment lors du développement de vos programmes. Cependant, il est important que vous essayiez de les empêcher. Un utilisateur de votre système de production peut être confondu s'il voit une erreur d'exécution, telle que l'erreur dans la figure. L'utilisateur peut ne pas comprendre une référence à l'application ABAP et aux informations techniques présentées.

Éviter les erreurs d'exécution

Diagramme montrant le flux logique d'une méthode avec branchement conditionnel afin d'éviter un vidage d'une partie de la mémoire
Exemple d'implémentation d'une méthode avec branchement conditionnel afin d'éviter un vidage d'une partie de la mémoire

Dans l'exemple ci-dessus, une logique a été ajoutée pour éviter l'erreur de division par zéro.

Utiliser une logique conditionnelle pour éviter une erreur d'exécution

Scénario de gestion

L'un de vos collègues a créé un programme qui calcule le nombre moyen de jours de congés restants pour chaque mois restant dans l'année. Un autre collègue a mentionné que le programme fonctionne étrangement lorsqu'il ne reste aucun mois dans l'année. Testez le programme et apportez les modifications nécessaires pour vous assurer qu'il fonctionne en toutes circonstances.

Remarque

Dans cet exercice, XX fait référence à votre numéro.

Étapes

  1. Dans votre package, créez une nouvelle classe ABAP avec le nom ZCL_XX_DUMP. Assurez-vous qu'il utilise l'interface IF_OO_ADT_CLASSRUN. Lorsque vous êtes invité à affecter la classe à un ordre de transport, utilisez l'ordre de transport que vous avez créé dans la tâche précédente.

    1. Sélectionnez FichierNouveauClasse ABAP.

    2. Saisissez votre package ZS4D100_XX

    3. Saisissez le nom ZCL_XX_DUMP et saisissez une description pour votre classe.

    4. Sélectionnez Ajouter... (en regard du cadre Interfaces).

    5. Saisissez le texte de filtre IF_OO_ADT_CLASSRUN. Double-cliquez sur l'entrée correspondante dans la liste des occurrences.

    6. Cliquez sur Next.

    7. Sélectionnez Sélectionner parmi les ordres dans lesquels je suis impliqué et votre propre ordre de transport.

    8. Sélectionnez Terminer.

  2. Dans if_oo_adt_classrun~main( ), ajoutez le code suivant :

    1. Dans l'éditeur, saisissez le codage suivant entre METHOD if_oo_adt_classrun~main et 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. Activez et testez votre classe.

    1. Activez la classe à l'aide du raccourci clavier Ctrl + F3.

    2. Exécutez la classe avec la touche F9.

    Résultat

    Le programme édite la moyenne des jours de congé restant par mois.
  4. Modifiez le programme de test, vérifiez le résultat s'il reste 0 mois dans l'année et que le salarié a 20 jours de congés non utilisés.

    1. Définissez la valeur de lv_mths sur 0.

    2. Sélectionnez Activate (Ctrl+F3).

    3. Exécutez le programme en sélectionnant F9.

    Résultat

    Le programme s'interrompt et affiche les détails d'une erreur d'exécution.
  5. Analysez l'erreur d'exécution pour identifier le problème. Pourquoi l'erreur s'est-elle produite ?

    1. Exécutez le programme en sélectionnant F9.

    2. Eclipse affiche une fenêtre pop-up en bas à droite avec le titre Erreur d'exécution ABAP.

    3. Cliquez sur le lien Afficher pour analyser l'erreur.

    4. Cliquez sur la page pour voir ce qui s'est passé et la ligne à l'origine de l'erreur.

    L'erreur s'est produite parce qu'il est mathématiquement impossible de diviser par zéro.

  6. Passez à l'éditeur ABAP.

    1. Sélectionnez l'onglet ZCL_S4D100_XX_DUMP.

  7. Pour éviter que l'erreur d'exécution ne se produise, implémentez une condition pour que le programme édite le texte suivant s'il ne reste plus de mois : Demandez si vous pouvez proroger vos congés restants. Sinon, effectuez le calcul et éditez le résultat comme précédemment.

    1. Ajoutez le code suivant autour du calcul existant :

      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. Activez et testez maintenant le programme.

      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.

      S'entraîner