2010-05-14 15 views
2

J'ai quelques endroits dans mon code où il lance une nouvelle exception System.Xml.XmlException appropriée. Je pouvais faireSi XmlException.SourceUri est en lecture seule, à quoi sert-il?

throw new XmlException("Your XML sucks go fix it then try again."); 

Mais je pense qu'il est préférable de profiter autant que possible des membres particuliers à la classe d'exception (sinon ya peut tout aussi bien jeter un plaine ol » Exception à chaque fois). SourceUri et LineNumber seraient utiles, mais ils seulement ont get méthodes, il n'y a aucun moyen de leur attribuer une valeur! Il n'y a que 3 surcharges constructeurs et aucun d'eux n'a de paramètres pour ces membres non plus; Je peux seulement initialiser Message, rien d'autre.

Il doit y avoir certains façon de remplir ces données membres avec des valeurs, sinon pourquoi XmlException s'en soucie-t-il? Je suppose que je pourrais faire une nouvelle classe qui hérite de XmlException et écrire un nouveau constructeur qui initialise SourceUri etc. mais encore, il doit y avoir un moyen d'utiliser simplement XmlException. Droite?

Répondre

1

Il est un constructeur qui prend un paramètre sourceUri:

internal XmlException(string res, string[] args, string sourceUri) 

Mais puisqu'il est interne, il ne peut être appelé à l'intérieur de l'ensemble System.Xml. De toute façon, je ne pense pas que vous devriez lancer un XmlException. Cette exception est généralement levée par les classes BCL liées au XML. Vous devriez plutôt créer votre propre exception et la lancer à la place.

+0

OK, un constructeur interne a du sens dans ce cas. Bien sûr, je pourrais hériter de XmlException, alors j'aurais accès aux membres 'protected'. –

2

Il esta constructor with the line number and line position. Je ne peux pas voir quoi que ce soit qui prend SourceUri si ...

Je crois que pouvez le remplir en utilisant le contexte de la sérialisation en continu - mais ce serait assez fragile.

Je pense qu'il est préférable de le considérer comme quelque chose qui est effectivement fourni uniquement par les XmlExceptions générées par le système. Je ne pense pas que cela le rende inutile - tout simplement moins flexible qu'il pourrait l'être. (Je soupçonne que la grande majorité des XmlExceptions qui sont jetés dans le monde sont jetés par le système plutôt que par le code utilisateur.)

+0

True, et si le contexte de diffusion a fonctionné pour modifier la valeur de SourceUri, il s'agit probablement plus d'un bogue de sécurité qu'une fonctionnalité. –

0

J'ai regardé en utilisant réflecteur, et il semblerait que seuls deux constructeurs donnent le SourceUri . Ce sont la désérialisation, et un seul constructeur interne qui définit tout, mais tous les publics appellent cela avec le SourceUri mis à null. Évidemment, aucun d'entre eux ne peut être facilement accessible. Je conclurais qu'il n'y a aucun bon moyen de définir la propriété SourceUri.