2010-06-20 3 views
10

Je me demande pourquoi les classes d'exceptions .NET de la classe de base Bibliothèque a certains membres mutables par défautPourquoi les exceptions .NET sont-elles mutables?

  • Pourquoi je peux changer la Source, HelpLink et les valeurs de Data, mais ne peut pas changer quoi que ce soit d'autre comme le Message ? Pourquoi le lancement de l'exception réécrit le StackTrace, le rendant également modifiable? Est-ce que l'ajout de l'information de trace de la pile à la trace existante serait une meilleure conception (mais toujours modifiable)? Quelles améliorations peuvent être apportées à la conception des exceptions .NET?

Je suis intéressant juste choix de conception ...

Répondre

9

Le StackTrace fait sens pour moi, au moins. L'idée est qu'un Exception (en tant qu'objet) peut être passé, renvoyé par des méthodes, etc. Le StackTrace est seulement important car une exception est lancée et interceptée. Dans un sens, StackTrace est vraiment plus d'une propriété du en lançant de l'exception, pas l'objet Exception lui-même. En ce qui concerne la mutabilité des autres propriétés, je suppose que c'est simplement parce qu'il est plus facile de construire une instance en affectant aux propriétés plutôt que de les forcer toutes dans le constructeur. Rappelez-vous qu'au moment où Exception a été conçu, C# n'avait pas de paramètres facultatifs.

Vous pouvez envisager une nouvelle conception dans laquelle Exception et les classes dérivées sont immuables, mais cela nécessite une classe d'usine ou de constructeur exceptionnelle. Il ferait juste dériver de Exception beaucoup plus complexe.

+0

ok, si le problème est de passer beaucoup de données en exception, pourquoi la propriété 'Message' est en lecture seule? – ControlFlow

+0

Bonnes pensées à propos de 'StackTrace' ... – ControlFlow

+0

' Message' est l'élément d'information non optionnel, il est donc logique de le mettre dans le constructeur. –

Questions connexes