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.
Réponse
Trop de publicités?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.