Avec des algorithmes parallèles frappant à la porte, ce pourrait être un bon moment pour penser à la gestion des erreurs.
Donc, au début, il y avait des codes d'erreur. Ceux-là étaient nuls. Il était libre de les ignorer, vous pourriez donc échouer tard et produire du code difficile à déboguer.
Viennent ensuite les exceptions. Celles-ci ont été rendues impossibles à ignorer une fois qu'elles se sont produites, et la plupart des gens (sauf Joel) les aiment mieux.
Et maintenant, nous avons des bibliothèques qui aident le code parallèle. Le problème est que vous ne pouvez pas gérer les exceptions dans le code parallèle aussi facilement que vous le pourriez avec du code non parallèle. Si vous lancez une tâche de manière asynchrone et qu'elle déclenche une exception, il n'y a aucune trace de pile au-delà pour se détendre; le mieux que vous puissiez faire est de le capturer et de l'enregistrer sur l'objet de tâche, s'il existe un tel objet. Cependant, il vainc la force principale des exceptions: vous devez les vérifier et vous pouvez les ignorer sans effort supplémentaire , alors que dans le code à thread unique, une exception déclenchera nécessairement les actions appropriées (même si cela signifie mettre fin à votre programme).
Comment les implémentations de langage ou les bibliothèques doivent-elles prendre en charge les erreurs dans le code parallèle?
Réponses:
J'aime plutôt les rappels d'erreurs qui peuvent être traitées. Et ils peuvent être faits pour fonctionner très bien de manière asynchrone ...
Mais pour les erreurs qui ne peuvent pas être gérées, les erreurs vraiment exceptionnelles , je préfère voir les informations pertinentes enregistrées et le programme terminé. Comme cela est généralement accompli via une sorte de gestionnaire d'erreurs global de toute façon, je ne vois pas la nécessité de transformer les exceptions en quelque chose qui fonctionne pour cela - mais un meilleur support de plate-forme pour détecter les erreurs critiques et produire des vidages de mémoire, etc. serait bien.
la source
Il semble que vous souhaitiez vous assurer que la tâche a géré ses propres exceptions, puis renvoyer quelque chose qui indique au programme appelant que le thread doit être arrêté. Il serait alors logique de traiter le résultat de tous les threads, sachant que certains de ces threads ont échoué.
la source