[C#] 型 ‘System.InvalidOperationException’ のハンドルされていない例外が System.Xml.dll で発生しました

Pocket

XMLの内容を入れるクラスを用意して、シリアライズ、デシリアイズでデータの受け渡しをすることは多いと思います。ただし、型には注意が必要となります。

スポンサーリンク

型 ‘System.InvalidOperationException’ のハンドルされていない例外が System.Xml.dll で発生しました

例えば、この例外が発生する時があります。どのようなケースかと言えば、クラスでは数値(例:int)で受け取るようになっているにも拘わらず、数値以外のデータがXMLに入っていた場合などです。シリアライズの詳細は次のページで確認できます。

C#


/// XMLデータを受け取るクラス
[Serializable()]
[System.Xml.Serialization.XmlRoot("rootElement")]
public class ModelIntValue
{
[System.Xml.Serialization.XmlElement("IntData"]
    public int intValue { get; set; }
}

XML

<rootelement>
    <!-- 全角文字のため int に変換できず例外発生 -->    
    <intdata>2018</intdata>
</rootelement>

どういった場合に問題となるか?

ひとえに、人手によってXMLデータが修正される場合です。人手で修正を行わないのであれば、プログラムで必ず数値となるような値を入れておけばよいだけです。

「システムによっては~」と聞こえてきそうですが、そんな大切なシステムであれば、XMLを手動で更新する運用にはしていないでしょう。

ただし、「ちゃんと、半角の数値を使え。間違えても全角で数値を入力するなよ。」ということが徹底されていれば、それはそれで問題ないことも多いと思います。「手順も注意事項も読まずに、間違えてXMLデータを入力したほうが悪い」で済ますのも一つの方法だと思います。

例外を抑止するには?

ただし、「例外を発生させるのはどうもねー」という人も、もちろんいることでしょう。実際にいましたし。ただ、私の記憶にある人は、全てにおいて「不安だから」「念のため」「一応ね」と言っていた人でした。「無知からくる漠然とした不安」を相手にしていた身としては正直とても相手にするのが面倒な人でした。

不必要なデータ検証だらけでソースの読みにくいことやら、「どうやってその個所はテストするんだよー。絶対通らないぞ。そこ。おい。こら。あ”?自分で何言ってるか意味わかってないだろ?」といった具合です。あなたも経験ありませんか?

悪い癖です。すぐに愚痴りたくなってしまします。話を戻します。

例外を抑制するには、int型で受けるのではなく、文字列型(string)で受けて、自分でXMLのデータが数値として妥当か検証すればよいだけです。

まあ、結局のところXMLなどの設定ファイルやデータファイルの妥当性の検証をどこまでをライブラリに任せて、どこまでを自分でやるかってだけの設計の話です。

イヤな記憶がよみがえりましたが、「ライブラリの例外なんて絶対ダメー」って、そこまで目くじら立てる必要もないと思います。

無知からくる漠然とした不安を抱えていたあの人は頭も薄くなり白くなってますよ。でも、不思議と覚えようとか、勉強しようとかとは思わないようです。残念ながら本人は自覚なしに、プロジェクトメンバーの足を引っ張るお荷物として元気に飯食ってます。

本当に邪魔ですよ。今は関わってないけど、メンバーの文句はいつも聞きます。聞くだけですけど。。。

いつの間にか、愚痴ってた。おわり。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *