2014-10-16 170 views
2

我有一個單獨的類文件,其中包含其他方法中的構造函數方法,並在Windows窗體中創建此類的實例。如果所需的文件不存在,那麼我需要在構造函數方法中執行一些異常處理,然後用FileNotFoundException來捕獲它。我唯一的問題是我不知道如何將異常的結果傳遞給Windows窗體,因爲我無法傳遞參數或從構造函數類返回任何數據。構造函數方法中的Try-Catch異常處理

+0

您能否包含代碼的縮寫版本?也許使用靜態方法而不是構造函數,如果你不想構造對象,如果文件讀取失敗? – 2014-10-16 21:10:41

回答

3

你犯了一個概念錯誤。構造函數在生活中有一個單一的目的:爲繁忙的生命週期準備一個類實例。因此它可能只有2個可能的結果:

  • 施工成功。該對象是可用的。
  • 施工失敗,因爲施工因異常而中止。

如果你所提到的文件是對象功能重要,你不應該捕獲異常並讓它溜走外面的初始化程序。在這種情況下,「返回一些錯誤」並將對象留在半可用狀態是沒有意義的。表單中的事件處理程序應該捕獲異常並將其傳遞給用戶。

如果有一個用例仍然可以返回一個可用的對象,那麼應該實現一個靜態方法,如public static MyClass instantiateConditionally(string filename, out bool somethingHappenedAlongTheWay)。這將允許你仍然返回一個實例,並返回出錯的地方。

1

即使拋出異常,您是否需要成功構建對象?

如果你不這樣做,那麼不要在構造函數中處理異常;在創建對象的窗體方法中處理它。

如果你這樣做,那麼我會建議在你的對象中實現一個布爾屬性HasErrors,如果在構造函數中處理異常,則返回true。還要實現一個方法GetErrors(),該方法返回任何處理的異常(方便地存儲在實例字段中)或null。這樣,如果在創建對象期間拋出任何異常並相應採取行動,則可以始終檢查Windows窗體方法。

0

你的意思是這樣嗎?

public class Form1 : Form 
{ 
    ... 


    public void button_Click(...) 
    { 
     try 
     { 
      var myclass = new MyClass(@"C:\...some file"); 
      ... 
     } 
     catch (FileNotFoundException) 
     { 
      MessageBox.Show("Can't find the file required"); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 
public class MyClass 
{ 
    public MyClass(string path) 
    { 
     if(string.IsNullOrEmpty(path)) 
      throw new ArgumentNullException(); 

     if(!File.Exists(path)) 
      throw new FileNotFoundException(); 
     ... 
    } 
} 

這裏我創建一個MyClass的實例,當用戶點擊某個按鈕時。

如果未指定路徑或者未在指定路徑中找到該文件,MyClass的類構造器將引發異常。

我使用try catch來捕獲拋出的任何異常並向用戶顯示一個messagebox。

相關問題