11
votes

Pouvez-vous réthrow une exception .NET sur un fil différent?

est-il légal et sûr en C # pour attraper une exception sur un fil, puis le jeter sur un autre.

E.g. est ce légal xxx

Je pense que c'est légal, mais j'ai du mal à trouver un doco qui le prouve. Le plus proche que j'ai trouvé était une brève mention de transfert d'exceptions entre threads ici: http: // msdn.microsoft.com/en-us/library/ms229005.aspx


2 commentaires

Pouvez-vous passer un objet d'un fil à un autre?


@Partial: Bien sûr que vous pouvez.


6 Réponses :


12
votes

Oui, c'est légal. Les exceptions sont des objets descriptifs (généralement parlant) sans affinité de fil.

Vous seriez mieux d'envelopper votre exception de thread dans une nouvelle exception: xxx

de cette façon, la trace de la pile dans localex sera préservée (comme le InnerException de la nouvelle exception).


2 commentaires

-1: Vous envisagez d'ajouter une citation? Si oui, je vais suivre alors.


Votre réponse était "Oui, c'est légal". Je pense que plus est nécessaire que cela. Vous avez développé votre réponse au point où le bowvote n'est pas nécessaire.



2
votes

Je ne vois pas pourquoi cela ne fonctionnerait pas, mais vous devez vous rappeler que vous ne retirez pas réellement l'exception. Vous lancez une nouvelle exception, cela se trouve être le même objet d'exception. Donc, par exemple, la trace de la pile dira qu'il a été jeté de "lancer localex;" au lieu de partout où l'exception originale venait de.


1 commentaires

Merci. Oui, Rethrow était le mauvais mot. Je vais utiliser localex comme exception intérieure pour éviter le problème de la pile d'appels que vous mentionnez.



3
votes

Qu'est-ce que vous faites n'est pas un retir. C'est un nouveau lancement d'une instance d'exception que vous aurez dans une variable. Même si vous utilisiez seulement un seul fil, ce serait une mauvaise idée, car il fait l'exception à l'exception de son site "Jet". Avec plusieurs threads, je n'ai aucune idée de la façon dont personne découvrirait qu'il y avait eu un changement de fil.


0 commentaires

2
votes

C'est légal et ce n'est pas une nouvelle exception, une nouvelle exception étant projetée sur un autre fil (avec le même objet d'exception)


0 commentaires

3
votes

absolument. System.AgregeatException est ajouté à .NET 4 Pour plus particulièrement ce but lors des opérations parallèles.


0 commentaires

0
votes

Je ne sais pas pourquoi tu penses que ce n'est pas légal. S'il était illégal sûrement, le compilateur attraperait ou l'exécution lancerait une exception. En fait, j'utilise ce modèle. @John dans une application Windows Forms qui appelle des services Web à l'aide d'un fil d'arrière-plan que j'utilise ainsi. L'exception est ensuite traitée dans l'application.ThreadException Handler de haut niveau, enregistrée, etc. Il est inutile de savoir dans quel fil l'exception s'est produite.


0 commentaires