3 votes

Comment lever des exceptions dans un serveur COM ?

Comment lever des exceptions dans un serveur COM pour qu'elles soient consommées par un client COM ? Mon serveur et mon client sont écrits en Delphi, si cela fait une différence ? En fait, j'ai un fil d'arrière-plan qui vérifie diverses choses dans mon serveur. Lorsqu'il n'est pas satisfait, il doit arrêter ce que fait le serveur et lever une exception. Cette exception doit être récupérée par le client. Je ne sais pas comment la gérer.

9voto

David Heffernan Points 292687

La réponse simple est que vous ne le faites pas. Les exceptions ne font pas partie de la spécification d'interopérabilité COM et ne doivent donc pas traverser les frontières des modules. Vous indiquez les erreurs avec des codes d'état.

Attrapez l'exception juste avant la sortie de votre méthode (dans chaque méthode de l'interface COM). Transformez le résultat en un code d'erreur. Si vous utilisez un HRESULT alors vous pouvez le consommer comme safecall et faire en sorte que le compilateur Delphi lève à nouveau une exception de l'autre côté de la barrière.


Le toujours bien informé Rob Kennedy fait remarquer dans un commentaire que safecall peut être utilisé "des deux côtés de la barrière", ce qui rend la vie encore plus facile que celle décrite ci-dessus.

Je ne suis pas du tout un expert en la matière (d'où le besoin d'être instruit par le commentaire de Rob). Cependant, le documentation indique que lorsque vous mettez en œuvre safecall vous devez remplacer les routines TObject.SafeCallException pour convertir les exceptions en HRESULT codes d'erreur. Certaines des classes standard liées à COM fournissent des versions surchargées, mais vous devrez peut-être ajouter votre propre logique au mélange. Le compilateur écrit des blocs Try/Except implicites dans les routines safecall qui gèrent les exceptions en appelant cette fonction virtuelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X