web-dev-qa-db-fra.com

Existe-t-il une solution générale au problème des "éclatements inattendus soudains d'erreurs" dans le logiciel?

Laisse moi expliquer ce que je veux dire.

J'ai fabriqué un complexe et fortement poli sur des années PHP Framework/Bibliothèque pour mon propre usage. Je vous enregistrerai de manière très agressive le plus petit notification et je l'aborderai immédiatement dès qu'il apparaît toujours, essayant toujours de Prédire les erreurs potentielles dans mon code pour ne jamais les avoir surviennent même dans des situations rares, mais plutôt les manipuler automatiquement avant de se connecter.

Cependant, malgré tous mes efforts, je me réveille inévitablement (comme aujourd'hui) de constater que certains services tiers ont des tripes avec leur format de fichier pour l'un de leurs fichiers de la CSV de données qu'ils fournissent sur leur site Web et qui Mon système récupère et importe tous les jours.

Ensuite, je reçois une inondation de Ugly PHP erreurs. Ouch.

Même si cela a l'air effrayant au début, il s'agit généralement d'une solution assez simple, et c'est généralement une seule erreur, ce qui en cascade dans des tonnes d'erreurs apparentes car la chaîne de fonction appelle "s'effondrer" comme chacun s'attend à ce qu'ils ne sont plus avoir.

Je corrige le problème, effacez les erreurs, réexécutez la logique, vérifiez qu'elle ne provoque plus aucune erreur, puis elle est corrigée. Pour l'instant. Jusqu'à ce que la même chose arrive à nouveau, une autre partie du système.

Je peux personnellement "traiter" cela, mais cela me dérange vraiment en termes de donner mon système à quelqu'un d'autre à courir sur leurs machines. Si/quand le même genre de chose se produit pour eux, ils me blâmera sans doute et penser que je suis incompétent (ce qui peut être vrai).

Mais même pour moi-même, c'est assez gênant et me fait sentir comme si mon système est très fragile et une maison de cartes qui attendent de tomber en morceaux, malgré il n'étant normalement pas un seul petit avis ou un avertissement normal ".

À court de prédire tout changement possible et d'écrire d'énormes quantités d'un code "vérifiant" supplémentaire pour vérifier que toutes les données sont toujours exactement ce que l'on attendait, est-ce que je peux faire tout ce que je peux faire pour résoudre ce problème général? Ou est-ce comme demander une pilule qui guérit une maladie instantanément?

S'il vous plaît, ne vous remerciez pas du fait que j'ai mentionné PHP. Je dirais que cette question va complètement indépendamment du langage ou de l'environnement de programmation. C'est vraiment plus une question philosophique que d'une OMI technique.

Je crains que la réponse soit: "Il n'y a pas de moyen. Vous devez mordre la balle et vérifier, vérifier et vérifier tout le temps!"

53
user379490

L'écriture d'énormes quantités de code "vérifiant" supplémentaire est malheureusement nécessaire malheureusement. Le code de contrôle est généralement suffisant pour aider, car vous pouvez obtenir les modifications qui rompent votre code en impression sur ce que le code a échoué où il a échoué. Ceci est utile à l'utilisateur si elles ont donné pour programmer une mauvaise entrée. L'échec avec des messages d'erreur décents lors des chèques est le moyen le plus simple de déboguer une mauvaise entrée.

L'un des moyens de valider les données est d'avoir un constructeur. Vous donnez au constructeur les morceaux de données que vous avez, puis de la construction d'un objet constitué de ces données. L'usine peut produire une logique floue (idée de Yakk), ou elle peut lancer une erreur si des données sont manquantes lorsque vous le diriez de construire. Vous pouvez également ajouter des méthodes au constructeur pour vérifier si les données ont été générées ou sont valides. Chaque flux de données dans le constructeur peut également vérifier que les données sont valables en entrée et lancez une erreur utile.

Anticiper la mauvaise contribution est une façon de faire face à cela comme vous dites dans votre question. Vous pouvez écrire un code d'écriture qui vérifie si les données doivent être égales (un exemple simple en être bonjour et bonjour étant les mêmes mots malgré le capitalisme). C'est vraiment quelque chose à attendre une erreur pour des exemples simples. Si l'utilisateur a vraiment besoin de vous pour prendre en charge un format, vous pouvez obtenir le message d'erreur avec des détails si vous avez écrit un bon code de vérification. Ensuite, vous pouvez ajouter une assistance au format qu'ils souhaitent. Cela peut être plus difficile dit que fait.

Si vous devez ajouter une assistance, l'utilisation d'une interface de base peut vous aider si vous devez modifier beaucoup de code. Donc, dire qu'un client a un format CSV différent, vous pouvez créer un code sur l'interface d'origine étiquetée avec ce client. Donc, avec votre exemple CSV, dites à un client utilise; S au lieu de la place, s. L'interface de base traiterait de cela et vous pouvez étiqueter le code sur Tope comme semicolonystèbrevalues ​​ou quelque chose comme ça. Cela prend une pensée quant à ce qui est nécessaire dans l'interface de base. Cela vient avec un inconvénient de beaucoup de refactoring s'il y a des choix de conception médiocre tôt, mais cela peut aider à prévenir le code en double et les fichiers de programme gonflables.

Vous pouvez également demander aux utilisateurs de votre logiciel quel est leur format. Assurez-vous s'il y a une erreur pour imprimer l'erreur avec le formatage qui a produit l'erreur afin de pouvoir corriger l'entrée; Ils peuvent également vous donner un message d'erreur décent qui vous aide à écrire plus de code robuste.

En ce qui concerne la messagerie d'erreur décente va, tant que l'erreur a des informations utiles et ne donne pas à l'utilisateur un crash ou une exception laids, vous êtes bon. Aller avec l'exemple CSV, si l'utilisateur a un fichier incorrect, vous devez afficher une erreur indiquant quel fichier, quelle ligne, et pourquoi cette ligne est mauvaise. Assurez-vous également de ne pas modifier l'état des données que vous signalez l'erreur, sinon vous serez laissé avec un bogue potentiellement très obscur, et pourrait confondre l'utilisateur.

Essayez d'éviter de créer des exceptions. Un exemple de Java étant une nullpointerexception. Vous pouvez transmettre NULL autour, mais à moins que vous ne vérifiez que NULL partout, il se passe, éventuellement une nullpoinpoinerexception sera lancée. En Java, ils ont un moyen d'éviter cela en utilisant des conteneurs vides. Si une méthode que vous utilisez jette une exception, vous souhaitez écrire du code qui ne déclenchera jamais cette exception.

De plus, très important, n'ignorez pas les exceptions comme moyen de manipulation d'erreurs. Vous couvrirez ce qui pourrait potentiellement causer des erreurs loin de leur source.

Minimiser les étendues variables contribue également aux erreurs. Avoir une variable globale que plusieurs programmes dépendent d'une bonne façon d'introduire un bogue. Donner à chaque programme sa propre variable est beaucoup plus sûre. Même plus sûr est la méthode variables locales.

Dans des environnements multithreading, l'utilisation de classes immuables contribue à éviter beaucoup de maux de tête potentiels. En fait, la multithreading est mieux évitée à moins que la performance est nécessaire, car les erreurs de débogage sont beaucoup plus difficiles dans un environnement multithread.

Vous voulez donner à l'utilisateur uniquement autant de contrôle que nécessaire. Vous voulez donner à l'utilisateur l'utilisateur comme peu de contrôle que nécessaire. Cela empêchera un utilisateur de gêner et de vous frustré par ce qu'ils perçoivent comme étant votre faute.

L'utilisation de programmes conçus pour faire des trucs pour vous est également un bon moyen d'éviter les erreurs. Un exemple simple étant A pour chaque boucle dans Java VS une boucle normale où il est beaucoup plus facile d'obtenir une indexOutOfboundsException.

Se familiariser avec le langage de programmation que vous utilisez est également un excellent moyen d'éviter les erreurs. Trouvez des matériaux de lecture et des exercices et faites-les.

En outre, dans des environnements multithreading, assurez-vous de synchroniser des données. C'est un sujet complexe en soi et a des livres écrits dessus. Encore une fois, limitez le contrôle de l'utilisateur. Ils ne devraient absolument pas être capable de muter des données synchronisées alors qu'elle est synchronisée.

J'ai essayé de rendre cette liste aussi générale que possible, mais les idées viennent de lire efficacement Java.

0
John Glen

Q: Je reçois une inondation de Ugly PHP erreurs ...

Un peu de prédiction de chaque changement possible ... Y a-t-il quelque chose que je puisse faire pour résoudre ce problème général?

A: Oui, définitivement. Comme Simon B a suggéré ci-dessus , vous voulez échouez rapidement et échouez fort . C'est un excellent conseil :)

Je suis surpris que personne n'a mentionné à l'aide exceptions (jeté où le problème est détecté pour la première fois) et essayer/attraper/enfin bloquer (à un niveau supérieur, où vous pouvez gérer intelligemment, et/ou récupérer).

Si vous êtes intéressé, veuillez consulter ces articles:

0
paulsm4