Prenons l'exemple minimale suivante:C#: Lancer une exception sans écraser le moment actif un
try { foo }
finally { bar() }
foo
peuvent ou peuvent ne pas jeter, et bar()
peut ou ne peut pas jeter. Si les deux fonctions sont lancées, l'exception lancée par bar()
remplacera l'exception lancée par foo
. Cependant, j'ai besoin de voir à la place l'exception qui a été lancée par foo
. Le seul code que je peux contrôler est celui à l'intérieur bar()
. En C++, cela peut être réalisé en vérifiant std::uncaught_exceptions
à bar()
. Qu'en est-il de C#?
Il ya a check using Marshal.GetExceptionPointers(), mais comme la réponse l'indique, c'est un hack horrible, et dans mon cas cela ne suffit pas car mon code doit fonctionner sur Mono, qui n'implémente pas cette fonction.
Contexte:
Dans mon cas, la vie réelle, foo
est un grand bloc de code qui est fourni par l'utilisateur de la bibliothèque et peut jeter toutes sortes d'exceptions, et bar()
est une fonction Dispose
qui est fourni par moi et appelé automatiquement.
Comme vous pouvez contrôler le code dans 'bar' envelopper dans bloc try/catch si l'extérieur, vous ne verrez que les exceptions lancées par' foo'. –