我有一個單獨的類文件,其中包含其他方法中的構造函數方法,並在Windows窗體中創建此類的實例。如果所需的文件不存在,那麼我需要在構造函數方法中執行一些異常處理,然後用FileNotFoundException
來捕獲它。我唯一的問題是我不知道如何將異常的結果傳遞給Windows窗體,因爲我無法傳遞參數或從構造函數類返回任何數據。構造函數方法中的Try-Catch異常處理
2
A
回答
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。
相關問題
- 1. 處理構造函數的異常
- 2. 異常處理和構造函數
- 3. C++構造異常處理
- 4. 類的構造函數中異常處理的行爲
- 5. 如何正確處理構造函數中的異常?
- 6. 在實現IDisposable時處理構造函數中的異常
- 7. .net IoC如何處理構造函數中的異常?
- 8. 處理構造函數中引發的致命異常
- 9. MVC3:如何處理控制器中的構造函數異常?
- 10. 在構造函數中的異常處理
- 11. 視圖模型構造函數的異常處理(重定向)
- 12. C#異常處理(給一個構造函數的字符串)
- 13. 異常構造函數與異常Java
- 14. 構造函數和異常
- 15. 構造函數處理異常並使用此關鍵字Java
- 16. 構造函數中的異常,java
- 17. RAII和構造函數中的異常
- 18. 異步方法中的異常處理
- 19. 在構造函數中捕獲異常
- 20. 從構造函數中拋出異常
- 21. 我應該如何處理WebAPI中控制器構造函數中的異常?
- 22. 從構造函數調用構造函數並捕獲異常
- 23. 如何很好地處理與Guice的構造函數中檢查的異常?
- 24. Java異常處理方法
- 25. Java異常getMessage()方法調用構造函數
- 26. 函數處理異常
- 27. 處理在asp.net MVC控制器構造函數中發生的異常
- 28. 在構造函數中處理的異常被傳回。怎麼樣?
- 29. Java - 處理大型GUI構造函數的最佳方法?
- 30. 雖然構造默認構造函數不能處理異常:類型由隱式超級構造函數拋出的異常
您能否包含代碼的縮寫版本?也許使用靜態方法而不是構造函數,如果你不想構造對象,如果文件讀取失敗? – 2014-10-16 21:10:41