Peut-être que ma vraie question est "Est-ce une fonctionnalité appropriée pour Learning Perl 6"? Basé sur Should this Perl 6 CATCH block be able to change variables in the lexical scope?, il semble que l'exemple le plus simple pourrait être au-delà d'un simple exemple.Quand est-ce que je voudrais reprendre une exception Perl 6?
Dans cette question, je travaillais avec quelque chose qui semble être idiot ou mieux d'une autre manière pour ce problème particulier parce que je jouais avec la fonctionnalité plutôt que de résoudre un problème. Il y a l'utilisation documentée des avertissements comme des exceptions spéciales ("exceptions de contrôle") où vous recevez le message, vous pouvez l'attraper si vous le souhaitez, mais vous pouvez aussi l'ignorer et il reprendra tout seul (bien que je sois plutôt stupide à ce sujet dans Where should I catch a Perl 6 warning control exception?). Au-delà de cela, je pense à des choses où l'appelant peut gérer une défaillance en dehors de la portée de l'appelé. Par exemple, se reconnecter à une base de données, réparer les répertoires manquants et autres problèmes de ressources externes dont l'appelé n'est pas responsable. En lisant ce genre de choses dans d'autres langues, le conseil a surtout été de ne pas les utiliser car dans la programmation "en monde réel" les gens ont tendance à ne pas vraiment gérer le problème de toute façon.
La réponse à C# exception handler resume next semble dire que c'est une mauvaise pratique et un code moche. Je n'ai certainement pas trouvé un moyen de cacher un tas de code dans l'appelé.
J'ai piraté cet exemple, même si je ne suis pas convaincu que ce soit un bon moyen de le faire ou quelque chose à recommander aux débutants. Le programme recherche un fichier PID au démarrage. S'il en trouve un, il lance une exception. La gestion de cette exception vérifie que l'autre instance est toujours en cours d'exécution, ce qui peut générer un type d'exception différent. Et, il y a celui pour gérer les problèmes d'IO de fichier. L'astuce est que le X::MyProgram::FoundSemaphore
peut reprendre si l'autre programme n'est pas en cours d'exécution (mais a laissé son fichier PID derrière).
Pas important pour la question, mais notez que 'BEGIN' s'exécute au moment de la compilation. Les modules sont compilés au moment de l'installation, donc ce code placé dans un module ne fait probablement pas ce qui est prévu. 'INIT' semblerait un meilleur pari pour le démarrage de programme, et fonctionnera bien dans le cas de module. –
Oui, INIT semble mieux. –