2

私のコードには、新しい System.Xml.XmlException をスローするのが適切と思われる場所がいくつかあります。私はちょうどすることができました

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

ただし、例外クラスに固有のメンバーを可能な限り利用する方がよいと思います (そうしないと、Exception毎回プレーン オールをスローすることもできます)。SourceUri と LineNumber は役に立ちますが、メソッドしかないのでget、値を割り当てる方法はありません! コンストラクターのオーバーロードは 3 つしかなく、それらのメンバーのパラメーターもありません。初期化することしかできずMessage、他には何もできません。

これらのデータ メンバーに値を設定する何らかの方法が必要です。

XmlException を継承する新しいクラスを作成し、SourceUri などを初期化する新しいコンストラクターを作成できると思いますが、それでも、XmlException を使用するだけの方法が必要です。右?

4

3 に答える 3

2

行番号と行位置を持つコンストラクター あります。しかし、SourceUriを取るものは何も見えません...

シリアライゼーション ストリーミング コンテキストを使用してデータを入力できると思いますが、それはかなり脆弱です。

システムがスローする XmlExceptions によってのみ実質的に提供されるものと見なすのが最善だと思います。私はそれが役に立たないとは思わない-それよりも柔軟性が低いだけです。(世界でスローされる XmlException の大部分は、ユーザー コードではなくシステムによってスローされるのではないかと思います。)

于 2010-05-14T17:10:22.220 に答える
1

パラメータを取るコンストラクタがありsourceUriます:

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

ただし、これは内部であるため、System.Xml アセンブリ内でのみ呼び出すことができます。とにかく、XmlException自分で投げるべきではないと思います。この例外は通常、XML 関連の BCL クラスによってスローされます。代わりに、独自の例外を作成してスローする必要があります。

于 2010-05-14T17:52:21.327 に答える
0

Reflector を使用して調べたところ、SourceUri を設定するコンストラクターは 2 つだけのようです。これらは逆シリアル化のものであり、すべてを設定する単一の内部コンストラクターですが、すべてのパブリックなものは、SourceUri を null に設定してそれを呼び出します。明らかに、それらのどれにも簡単にアクセスできません。SourceUri プロパティを設定する良い方法はないと結論付けます。

于 2010-05-14T17:16:23.210 に答える