2010-10-21 36 views
4

我在加載序列化文件的部分中遇到了問題。如果文件不能反序列化,我想很好地失敗,但由於某種原因,我的程序會中斷而不是進入catch子句。這是我的代碼C#無法捕獲SerializationException

using (FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open)) 
       { 
        try 
        { 
         BinaryFormatter bf = new BinaryFormatter(); 
         document = (Document)bf.Deserialize(fs); 
        } 
        catch (SerializationException se) 
        { 
         MessageBox.Show("Error opening this file due to serialization", se.Source); 
        } 
        catch (Exception se) 
        { 
         MessageBox.Show("Error opening this file due to serialization", se.Source); 
        } 
       } 

運行這會導致程序在Deserialize()行上中斷。這是它拋出異常:

Type 'Source' in Assembly 'DocumentDesigner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable. 

我知道如何解決的例外,因爲我註釋掉一對夫婦[Serializable接口]屬性來測試這一點,但我只是想知道爲什麼try子句不工作。

+1

所以你在調試模式下運行程序?您正在使用Visual Studio?你能否將調試器設置爲在所有第一次機會異常時中斷? – YWE 2010-10-21 14:22:00

+1

您是在調試器/ VS 2010中運行代碼嗎?你不應該 - 否則基於設置調試器可能會提示你。另外,你確定你遇到的異常是SerializationException嗎? – VinayC 2010-10-21 14:23:39

+0

這是問題所在。我已經更改了調試器來打破Debug-> Exceptions中的所有CLR異常。取消選中該框可以讓catch子句捕獲它。謝謝 – wangburger 2010-10-21 14:30:43

回答

3

在調試菜單中,轉到例外。您可能已針對用戶未處理和投擲都檢查了公共語言運行時異常。

這將導致Visual Studio調試器中斷所有異常,即使它們位於try/catch塊中。

如果您在調試器擊中斷點後按F10繼續,您應該看到它進入您的catch塊。

+0

良好的通話。這仍然讓我每隔一段時間。 – Greg 2010-10-21 15:08:47

0

如果你想獲得SerializationException,你必須在序列化過程中得到一個異常。評論[Serializable]你不能得到一個SerializationException。這樣想,你不能創建超時異常而不創建數據庫連接。所以把[Serializable]放回去,並給出錯誤的參數來獲得SerializationException。

0

你爲什麼不看看拋出異常的類型?然後你會知道你需要捕捉什麼異常。我猜這不是SerializationException,如果你的第一個catch塊沒有抓住它。