3.4 · Gestion des erreurs & débogage

Niveau 3 · Avancé : WLangage approfondi

3.4Gestion des erreurs & débogage

Objectif : gérer les exceptions (QUAND EXCEPTION), utiliser le débogueur (points d'arrêt, pas à pas).
Temps estimé : 11 min

Un code ROBUSTE ne suppose jamais que tout se passera bien. En WinDev, on distingue plusieurs situations. (1) L'ERREUR DE COMPILATION : détectée avant l'exécution (faute de syntaxe, nom inconnu) — l'éditeur les signale au fil de l'écriture. (2) L'ERREUR D'EXÉCUTION : elle survient pendant le fonctionnement (division par zéro, fichier absent, accès refusé, réseau coupé). (3) L'ERREUR FONCTIONNELLE : le programme s'exécute mais le RÉSULTAT est faux — la plus dangereuse, car rien ne la signale. Pour traiter les erreurs d'exécution, le WLangage propose notamment le mécanisme QUAND EXCEPTION (traiter une erreur sans planter), et les fonctions HFSQL renvoient des informations d'erreur qu'il faut TESTER (ne présumez jamais qu'une écriture a réussi).

Le DÉBOGAGE est l'art de trouver l'origine d'un problème. WinDev fournit un DÉBOGUEUR intégré très complet : POINTS D'ARRÊT (stopper l'exécution à un endroit précis), exécution PAS À PAS (dérouler le code ligne par ligne), inspection des VARIABLES (voir leur contenu en direct), pile d'appels. S'y ajoutent la TRACE (afficher des informations pendant l'exécution) et le journal. La MÉTHODE compte autant que les outils : (1) REPRODUIRE le problème de façon fiable — un bug qu'on ne sait pas reproduire ne peut pas être corrigé sûrement ; (2) ISOLER : réduire le périmètre jusqu'à cerner l'endroit fautif ; (3) COMPRENDRE la cause réelle (pas seulement le symptôme) ; (4) CORRIGER puis VÉRIFIER que le cas fonctionne ET que rien d'autre n'a cassé. Côté utilisateur, deux principes : ne jamais afficher un message technique brut (« Erreur 0x8004 ») mais un message COMPRÉHENSIBLE et actionnable ; et JOURNALISER les erreurs pour pouvoir diagnostiquer après coup ce qui s'est passé chez le client.

Vocabulaire de la section

Types d'erreurs
COMPILATION (détectée avant l'exécution : syntaxe, nom inconnu), EXÉCUTION (pendant le fonctionnement : division par zéro, fichier absent, réseau coupé), FONCTIONNELLE (le programme tourne mais le résultat est FAUX — la plus dangereuse).
QUAND EXCEPTION
Le mécanisme du WLangage pour intercepter une erreur d'exécution et la traiter proprement, au lieu de laisser l'application planter devant l'utilisateur.
Débogueur
L'outil intégré : POINTS D'ARRÊT (stopper à un endroit précis), PAS À PAS (dérouler ligne par ligne), inspection des VARIABLES en direct, pile d'appels.
Méthode de débogage
REPRODUIRE le problème de façon fiable → ISOLER (réduire le périmètre) → COMPRENDRE la cause réelle (pas le symptôme) → CORRIGER puis VÉRIFIER (le cas ET l'absence de régression).
Messages et journalisation
Ne JAMAIS afficher un message technique brut à l'utilisateur : donner un message COMPRÉHENSIBLE et actionnable. JOURNALISER les erreurs pour diagnostiquer après coup ce qui s'est passé chez le client.
Vérifiez votre compréhension

Quelle est la bonne méthode pour trouver l'origine d'un bug ?

Tutoriel 3.4
Tutos « 3.4 » WinDev gestion erreur exception débogage (recherche)
Cliquer pour voir les résultats à jour ↗

En pratique — Rendre son code robuste et déboguer

  1. Encadrez les opérations risquées (accès fichier, réseau, conversion, calcul) et TESTEZ les retours des fonctions HFSQL — ne présumez jamais qu'une écriture a réussi.
  2. Utilisez le DÉBOGUEUR : posez un point d'arrêt avant la zone suspecte, avancez en PAS À PAS et inspectez les variables pour voir où la valeur devient fausse.
  3. Appliquez la méthode : REPRODUIRE de façon fiable, ISOLER le périmètre, COMPRENDRE la cause réelle, CORRIGER puis VÉRIFIER l'absence de régression.
  4. Remplacez les messages techniques par des messages COMPRÉHENSIBLES pour l'utilisateur, et JOURNALISEZ les erreurs pour le diagnostic ultérieur.
Votre application résiste aux imprévus, informe correctement l'utilisateur, et vous disposez d'une méthode fiable pour localiser et corriger les défauts.

Points clés à retenir

  • Trois familles d'erreurs : COMPILATION (avant exécution), EXÉCUTION (pendant : fichier absent, réseau coupé, division par zéro — traitables via QUAND EXCEPTION) et FONCTIONNELLE (le programme tourne mais le résultat est FAUX — la plus DANGEREUSE car rien ne la signale).
  • Ne présumez JAMAIS qu'une opération a réussi : testez les retours des fonctions HFSQL et contrôlez les cas limites. Un code robuste prévoit ce qui peut mal se passer.
  • Le DÉBOGUEUR intégré est complet : POINTS D'ARRÊT, exécution PAS À PAS, inspection des VARIABLES en direct, pile d'appels — complété par la TRACE et le journal.
  • La MÉTHODE prime : REPRODUIRE de façon fiable (un bug non reproductible ne peut être corrigé sûrement) → ISOLER → COMPRENDRE la cause réelle (pas le symptôme) → CORRIGER + VÉRIFIER l'absence de régression. Côté utilisateur : messages COMPRÉHENSIBLES (jamais de code technique brut) et JOURNALISATION pour diagnostiquer à distance.

Questions fréquentes

Comment traiter une erreur sans faire planter l'application devant l'utilisateur ?

En anticipant les opérations risquées (les encadrer et tester leurs retours), en interceptant les erreurs pour les traiter proprement, en affichant un message COMPRÉHENSIBLE et en JOURNALISANT le détail technique pour le diagnostic — jamais l'inverse. Ce qu'il faut anticiper : (1) Tout ce qui dépend de l'EXTÉRIEUR : accès à un fichier (absent, verrouillé, droits insuffisants), accès réseau ou base de données (serveur indisponible, coupure), impression (imprimante éteinte), service web (délai dépassé). Ces situations ARRIVERONT — ce n'est pas une hypothèse d'école. (2) Les données : conversions (texte non numérique, date invalide), valeurs vides, division par zéro, dépassements. (3) Les résultats d'opérations sur les données : recherche infructueuse (HEnDehors), écriture refusée (doublon de clé, contrainte d'intégrité, enregistrement verrouillé par un autre utilisateur). Les mécanismes : (1) TESTER les retours des fonctions : c'est la première ligne de défense. Une écriture HFSQL peut échouer ; vérifiez plutôt que de supposer. (2) Intercepter les erreurs (QUAND EXCEPTION) autour des zones sensibles pour reprendre la main au lieu de laisser l'application s'interrompre brutalement. (3) Prévoir un COMPORTEMENT de repli : réessayer, proposer une alternative, annuler proprement l'opération en cours (avec une TRANSACTION si plusieurs écritures sont liées, pour éviter un état incohérent). Ce qu'il faut afficher à l'utilisateur : (1) Un message COMPRÉHENSIBLE, dans son langage : « Impossible d'enregistrer la commande : le serveur de données n'est pas accessible. Vérifiez votre connexion réseau ou contactez le support. » (2) JAMAIS un code technique brut (« Erreur 0x80004005 », un message d'exception, une trace) : cela ne l'aide pas, l'inquiète et donne une image d'amateurisme. (3) Dire ce qu'il peut FAIRE : réessayer, vérifier quelque chose, appeler le support. Un message qui n'indique aucune action est frustrant. (4) Dire ce qui s'est passé pour ses DONNÉES : « votre saisie n'a pas été enregistrée » est une information capitale. L'ambiguïté est pire que la mauvaise nouvelle. Ce qu'il faut journaliser : (1) Le détail TECHNIQUE (message d'erreur exact, code, contexte, utilisateur, date/heure, opération en cours) dans un JOURNAL. (2) C'est indispensable pour diagnostiquer un incident survenu chez un client, à distance, plusieurs jours plus tard. Sans journal, vous en êtes réduit aux suppositions. (3) Prévoyez la consultation et la rotation de ces journaux. (4) ⚠️ Attention aux DONNÉES PERSONNELLES dans les journaux : ne journalisez pas de mots de passe ni d'informations sensibles inutiles (⚠️ la réglementation sur les données personnelles varie selon les pays). La règle d'or : (1) Message SIMPLE pour l'utilisateur, détail TECHNIQUE dans le journal. C'est la séparation fondamentale. (2) Ne masquez pas une erreur silencieusement : intercepter une erreur pour ne rien faire est pire que tout, car l'application continue avec des données potentiellement fausses. (3) Testez vos gestions d'erreur (débranchez le réseau, renommez un fichier, saisissez n'importe quoi) : une gestion d'erreur jamais testée ne fonctionne généralement pas. En résumé : anticipez toutes les opérations qui dépendent de l'extérieur (fichiers, réseau, base, impression, services web) et de la qualité des données (conversions, valeurs vides, recherches infructueuses, écritures refusées), car ces situations se produiront réellement. Testez systématiquement les retours de fonctions plutôt que de supposer la réussite, interceptez les erreurs (QUAND EXCEPTION) pour reprendre la main proprement, et prévoyez un comportement de repli — en encadrant si nécessaire les écritures liées dans une TRANSACTION pour ne jamais laisser les données dans un état incohérent. Côté interface, appliquez la règle d'or : message SIMPLE et actionnable pour l'utilisateur (ce qui s'est passé, ce qu'il advient de sa saisie, ce qu'il peut faire), détail TECHNIQUE dans un JOURNAL — jamais un code d'erreur brut à l'écran, qui n'aide personne et fait amateur. La journalisation est ce qui vous permettra de diagnostiquer un incident survenu chez un client, à distance et a posteriori ; veillez simplement à ne pas y consigner de données sensibles. Enfin, deux pièges : ne jamais avaler une erreur en silence (l'application poursuivrait avec des données fausses), et toujours TESTER vos gestions d'erreur en provoquant réellement les pannes.

Quelle est la meilleure méthode pour trouver l'origine d'un bug ?

Une démarche rigoureuse en quatre temps : REPRODUIRE de façon fiable, ISOLER le périmètre, COMPRENDRE la cause réelle, puis CORRIGER et VÉRIFIER — les outils (débogueur, trace) ne servent qu'à appuyer cette méthode, jamais à la remplacer. Étape 1 — REPRODUIRE : (1) C'est l'étape la plus importante, et la plus souvent bâclée. Un bug qu'on ne sait pas reproduire ne peut pas être corrigé avec certitude : on ne saura même pas si le correctif a fonctionné. (2) Identifiez les conditions EXACTES : quelles données, quelles actions, dans quel ordre, quel utilisateur, quel poste. (3) Interrogez précisément l'utilisateur : « que faisiez-vous exactement ? », « pouvez-vous refaire la manipulation ? ». Les descriptions vagues (« ça ne marche pas ») sont inexploitables. (4) Les bugs INTERMITTENTS demandent plus d'efforts : cherchez ce qui varie (volume de données, concurrence entre utilisateurs, moment de la journée, poste particulier, droits). Étape 2 — ISOLER : (1) Réduisez le périmètre : le problème vient-il des données, du code, de l'interface, de l'environnement (réseau, droits, version) ? (2) Testez les hypothèses une par une, en ne changeant qu'un paramètre à la fois. (3) Le débogueur intervient ici : posez un point d'arrêt avant la zone suspecte, avancez en PAS À PAS et regardez à quel moment précis une variable prend une valeur inattendue. C'est extrêmement efficace. (4) La TRACE est utile quand le pas à pas est impraticable (boucle sur un gros volume, traitement chez un client). (5) Vérifiez les DONNÉES : bien souvent, le code est correct et ce sont les données qui sont incohérentes. Étape 3 — COMPRENDRE : (1) Cherchez la CAUSE RÉELLE, pas le symptôme. Si un total est faux, la cause n'est pas « le total est faux » : c'est peut-être une jointure produisant des doublons, un filtre absent, un arrondi, un enregistrement en double. (2) Ne corrigez pas au hasard. Le pire réflexe est de modifier du code jusqu'à ce que le symptôme disparaisse : le vrai défaut reste, et il ressurgira ailleurs. (3) Demandez-vous POURQUOI l'erreur a été possible : cela révèle souvent d'autres cas similaires à corriger. Étape 4 — CORRIGER et VÉRIFIER : (1) Corrigez la cause identifiée, proprement. (2) Vérifiez que le cas d'origine fonctionne désormais — en reproduisant exactement le scénario de départ. (3) Vérifiez l'absence de RÉGRESSION : votre correction n'a-t-elle rien cassé ailleurs ? C'est ici que les TESTS AUTOMATIQUES prennent toute leur valeur. (4) Testez les cas VOISINS (valeurs limites, cas similaires). (5) Documentez si le problème était subtil : votre futur vous-même vous remerciera. Les erreurs de méthode à éviter : (1) Corriger sans avoir reproduit. (2) Modifier plusieurs choses à la fois : on ne sait plus ce qui a résolu le problème. (3) Traiter le symptôme (masquer un message d'erreur) au lieu de la cause. (4) Ne pas vérifier les régressions. (5) Se fier à sa mémoire plutôt qu'au débogueur : le code fait ce qu'il fait, pas ce que vous croyez qu'il fait. En résumé : la meilleure méthode tient en quatre étapes disciplinées. REPRODUIRE d'abord, de façon fiable et avec les conditions exactes (données, actions, ordre, poste, utilisateur) — c'est l'étape la plus décisive, car un bug non reproductible ne peut être corrigé avec certitude, et pour les cas intermittents il faut chercher ce qui varie (volume, concurrence, droits, poste). ISOLER ensuite en réduisant le périmètre et en ne changeant qu'un paramètre à la fois, avec l'appui du DÉBOGUEUR (point d'arrêt avant la zone suspecte, PAS À PAS, inspection des variables pour repérer l'instant exact où une valeur devient fausse) ou de la TRACE quand le pas à pas est impraticable — sans oublier de vérifier les DONNÉES, souvent coupables alors que le code est correct. COMPRENDRE la cause RÉELLE et non le symptôme : un total faux vient peut-être d'une jointure qui duplique, d'un filtre manquant ou d'un arrondi ; ne modifiez jamais du code au hasard jusqu'à ce que le symptôme disparaisse, car le défaut resurgira ailleurs. Enfin CORRIGER puis VÉRIFIER doublement : le scénario d'origine fonctionne, ET rien d'autre n'a cassé (c'est là que les tests automatiques prennent toute leur valeur). Retenez que le code fait ce qu'il fait, pas ce que vous croyez : fiez-vous au débogueur, pas à votre mémoire.

Autres ressources