30 votes

Pourquoi le C# ne prend-il pas en charge le filtrage des exceptions au premier passage ?

Remarque : il ne s'agit pas une duplication de la question de Jeff .

Cette question demandait "Est-ce qu'un équivalent ?" Je sais qu'il n'y en a pas, et je veux savoir pourquoi !

Si je vous demande cela, c'est que je viens tout juste de comprendre l'importance de cette question et que la conclusion me semble très étrange.

Le bloc de gestion des exceptions de la bibliothèque d'entreprise de Microsoft nous conseille d'utiliser ce modèle :

catch (Exception x)
{
    if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy))
        throw;

    // recover from x somehow
}

La politique est définie dans un fichier XML, ce qui signifie que si un client a un problème, nous pouvons modifier la politique pour l'aider à localiser (ou peut-être à masquer) le problème afin de lui donner une solution rapide jusqu'à ce que nous le traitions correctement - ce qui peut impliquer de se disputer avec des tiers, pour savoir à qui la faute.

Il s'agit essentiellement d'une reconnaissance du simple fait que, dans les applications réelles, le nombre de types d'exceptions et leur statut de "récupérabilité" sont pratiquement impossibles à gérer sans un tel dispositif.

Pendant ce temps, l'équipe CLR de MS dit que ce n'est pas une option, et il s'avère que ces gars-là savent de quoi ils parlent ! Le problème est que juste avant que le catch le bloc s'exécute, tout finally imbriqués dans les blocs try sera exécuté. Ainsi, ces finally Les blocs peuvent effectuer l'une des actions suivantes :

  • Modifier de manière inoffensive l'état du programme (ouf, chanceux).
  • Jeter quelque chose d'important dans les données du client, parce que l'état du programme est foutu à un degré inconnu.
  • Déguiser ou détruire des preuves importantes dont nous avons besoin pour diagnostiquer un problème - surtout si nous parlons d'appels au code natif.
  • Lancer un autre exception, ajoutant à la confusion et à la misère générale.

Notez que le using et les destructeurs C++/CLI sont construits à partir de try / finally donc ils sont aussi concernés.

Il est donc clair que le catch / throw Le modèle de filtrage des exceptions n'est pas bon. Ce dont nous avons besoin, c'est d'un moyen de filtrer les exceptions, via une politique, sans les attraper et donc sans déclencher l'exécution de la commande finally à moins que nous ne trouvions une politique qui nous dise que l'exception est sans danger pour la récupération.

L'équipe CLR a récemment publié un blog à ce sujet :

Le résultat est que nous devons écrire une fonction d'aide en VB.NET pour nous permettre d'accéder à cette capacité vitale depuis C#. Le gros indice qu'il y a un problème est qu'il y a du code dans la BCL qui fait cela. De nombreuses personnes ont écrit des articles sur la façon de le faire, mais elles ne mentionnent que rarement, voire jamais, la chose suivante try / finally blocs, ce qui est le tueur.

Ce que je voudrais savoir, c'est :

  • Y a-t-il des déclarations publiques ou des courriels directs que les gens ont reçus de l'équipe C# à ce sujet ?
  • Existe-t-il des suggestions de Microsoft Connect existantes qui demandent cela ? J'ai entendu des rumeurs à ce sujet, mais aucun des mots-clés n'a donné de résultat.

Mise à jour : Comme indiqué ci-dessus, j'ai déjà effectué des recherches sur Microsoft Connect sans rien trouver. J'ai également (sans surprise) fait des recherches sur Google. Je n'ai trouvé que des personnes en expliquant pourquoi ils ont besoin de cette fonctionnalité ou en soulignant la ses avantages en VB.NET ou en espérant futilement que ce sera ajouté dans une future version de C# o contourner le problème Et beaucoup de conseils trompeurs . Mais aucune déclaration sur la raison de son omission dans toutes les versions actuelles de C#. Et la raison pour laquelle je pose des questions sur les problèmes de connexion existants est que (a) je ne crée pas un doublon inutile et (b) je peux dire aux personnes intéressées si je dois en créer un.

Mise à jour 2 : Trouvé un ancien billet de blog intéressant d'Eric Gunnerson anciennement de l'équipe C# :

"Oui, être capable de mettre une condition sur une capture est un peu plus pratique que d'avoir à écrire le test vous-même, mais cela ne vous permet pas vraiment de faire quelque chose de nouveau".

C'était la même hypothèse que j'avais jusqu'à ce qu'on me l'explique correctement !

4voto

JaredPar Points 333733

Quant aux bugs de connexion existants. Le problème suivant concerne les flitres d'exception. L'utilisateur n'a pas explicitement indiqué qu'il voulait qu'ils soient un filtre réel dans le sens du moment où ils s'exécutent mais, à mon avis, c'est implicite dans la logique.

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=401668

En dehors de ce problème, il n'y a aucun problème que je puisse trouver ou connaître qui soit lié à ce que vous recherchez. Je pense qu'il serait bon d'avoir un problème séparé qui appelle explicitement le besoin de filtres d'exception de style VB.Net.

Je ne m'inquiéterais pas trop de l'introduction d'une question en double si vous avez fait preuve de diligence raisonnable en recherchant une question existante. S'il y a un doublon, Mads le fera en conséquence et vous renverra à la demande principale.

Quant à la partie concernant l'obtention d'une réponse officielle de l'équipe C#, vous l'obtiendrez probablement lorsque vous 1) déposerez un bug de connexion ou 2) serez dupés par rapport au bug principal. Je doute vraiment qu'il y ait une raison ou une justification officielle à l'heure actuelle.

Voici mon spéculation sur la question : Je pense que cette fonctionnalité ne figurait tout simplement pas dans le jeu de fonctionnalités original de C# 1.0 et que, depuis lors, il n'y a pas eu assez de demandes pour qu'elle soit intégrée au langage. Les équipes C# et VB passent un temps fou à classer les fonctionnalités du langage au début de chaque cycle de développement. Nous devons faire très des coupes parfois difficiles. Si la demande n'est pas suffisante, il y a très peu de chances qu'une fonctionnalité soit intégrée dans la langue.

Jusqu'à récemment, je parie que vous auriez du mal à trouver une personne sur dix qui comprenne la différence entre les fonctions Try/When de VB.Net et l'utilisation d'une simple instruction if dans un bloc catch en C#. Il semble que les gens y pensent un peu plus ces derniers temps, alors peut-être que cela fera partie d'une future version du langage.

2voto

Steve Steiner Points 4044

Utilisation de Exception Filtre Injecter peut être plus simple que d'utiliser la solution de contournement des délégués.

Pour une véritable réponse à votre question, il vous faudra une réponse d'Anders Hejlsberg, ou de quelqu'un qui a participé aux réunions de conception initiales. Vous pourriez essayer de voir si vous pouvez la faire poser par l'intervieweur de Channel 9 la prochaine fois. l'équipe de conception C# est interrogée .

Je suppose que lorsque la décision initiale a été prise, les filtres d'exception étaient considérés comme une complication inutile qui pouvait faire plus de mal que de bien. Vous pouvez certainement voir un désir de rester "silencieux" sur des fonctionnalités non prouvées dans cette interview sur la décision de ne pas supporter les exceptions vérifiées : Le problème des exceptions vérifiées .

Je pense que les scénarios de diagnostic post-moterm plaident fortement en faveur de la fourniture d'un accès aux filtres d'exception dans le langage. Cependant, ces scénarios n'ont peut-être pas été formulés à l'époque. De plus, ces scénarios ont vraiment besoin d'un support d'outils approprié, qui n'était certainement pas disponible dans la V1. Enfin, l'ajout de cette fonctionnalité peut présenter des inconvénients importants que nous n'avons pas envisagés.

S'il n'y a pas de bogue de connexion à ce sujet, vous devriez en créer un et encourager les autres à voter en sa faveur. [Je recommanderais de demander l'accès à la fonctionnalité CLR plutôt que d'essayer de concevoir la manière dont elle s'intègre dans le langage].

1voto

andleer Points 12090

Je ne crois pas que Java dispose d'une option de filtrage non plus. Je suppose que si c'était le cas, nous en verrions également une en C#. VB.net en possède probablement une par hasard, étant donné que l'équipe VB est partie d'une page blanche.

Une chose qui pourrait jouer en votre faveur pour ce qui est d'obtenir cette option dans une future version de C# est l'objectif déclaré de Microsoft de maintenir la parité entre les fonctionnalités du langage dans les futures versions de C# et VB.net. C'est sur cette base que j'avancerais mes arguments.

http://www.chriseargle.com/post/2009/01/Parity-Between-Languages.aspx

0voto

casperOne Points 49736

En ce qui concerne la première question, s'il y a eu une déclaration publique, il est plus que probable qu'elle a été mise sur le web quelque part, auquel cas, Google devrait trouver quelque chose (si cela existe).

S'il s'agit d'un e-mail direct avec l'équipe C#, il est plus que probable qu'il soit sous NDA, et qu'il ne puisse donc pas être publié de toute façon.

Pour ce qui est de la deuxième question, il existe une fonction de recherche sur Microsoft Connect que l'on vous invite à utiliser avant de saisir une nouvelle suggestion. Si vous ne la trouvez pas, c'est qu'il n'y en a probablement pas.

Je vous recommande de formuler une suggestion, puis de la promouvoir afin que d'autres personnes y apportent leur contribution.

0voto

Andrey Shchekin Points 7740

D'après ce que je comprends, au moment du rethrow, les gestionnaires finally des fonctions internes sont exécutés et c'est ce qui vous pose problème.

Mais disons que vous avez un filtre d'exception qui laisse passer l'exception sans la rejeter. Vous devrez toujours la gérer d'une manière ou d'une autre quelque part, et vous rencontrerez les mêmes types de problèmes (effets finaux).

Donc, à moins que je ne comprenne mal quelque chose, il n'y a pas grand intérêt à avoir des filtres d'exception supportés par le langage.

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