2013-10-29 63 views
3

如果我看到這個XML:反序列化異常處理

<?xml version="1.0"?> 
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <FontPath>sciezka</FontPath> 
    <CodingCP852v2>44</CodingCP852v2> 
    <LedText>Napismoj</LedText> 
</Settings> 

反序列化將顯示在內部異常:

{"The string '44' is not a valid Boolean value."} 

現在我想從現場wchich造成異常的異常對象名稱來讀取(在這個例子我應該得到「編碼」)。怎麼做?

[Serializable] 
public class Settings 
{ 
    public string FontPath 
    { 
     get; 
     set; 
    } 

    public bool Coding 
    { 
     get; 
     set; 
    } 
} 

try 
{ 
    using (FileStream s = File.OpenRead(fileName)) 
    { 
      XmlSerializer xs = new XmlSerializer(typeof(Settings)); 
       return (Settings)xs.Deserialize(s); 
    } 
} 
catch (Exception ex) 
{ 
    return new Settings(); 
} 
+0

我不得不問,爲什麼編碼首先是一個布爾值? – nuke

+0

您是否考慮過僅顯示異常文本?它讓我感到,你想要允許這樣的錯誤的唯一原因是因爲你有用戶可編輯的XML輸入。你也可以將它們暴露給錯誤,因爲它們熟悉xml。拋出行和列號,他們擁有所有需要的信息來識別錯誤的值。 – Gusdor

+0

這將是一個錯誤,在XML文件中存在許多可能的其他錯誤,超出了元素的錯誤值。試圖從損壞的文件中產生有用的信息是很危險的,這與您的「有用信息」同樣可能會損壞。通過瘋狂的追逐發送用戶。你已經得到了一個很好的內部異常,告訴用戶*確切地說*在文件中查找損壞的位置,不要幫助。 –

回答

0

XmlSerializer的將總是遙,InvalidOperationException。在你的情況的內部例外將是System.Xml.XmlException

此異常的文檔顯示可能是可用的屬性。它們都不是錯誤節點的名稱。 http://msdn.microsoft.com/en-us/library/system.xml.xmlexception.aspx

看來獲得名稱的唯一方法是使用XmlReader手動解析文檔並自己檢查類型。如果省略模式,這將使您對類型映射和驗證進行非常細緻的控制。 http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx