2010-07-05 52 views
2

不要認爲這是可能的,但認爲我會問,也許有人可能會建議一種替代技術或模式。C#在運行時返回異常

假設我有一個客戶類,它的書籍列表都是從外部來源單獨提取的。如果客戶類是全成,但圖書無法加載,我不想拋出異常,除非客戶端嘗試訪問書籍屬性,以便..

this.Books = new List<Book>() 
{ 
    throw new Exception("Books couldn't load because blah blah"); 
}; 

是沿着這些線路可能的東西嗎?

+0

順便說一句,FCL有這樣的情況下的一些特殊類 - 'ArgumentException','ArgumentNullException'和'ArgumentOutOfRangeException' – abatishchev 2010-07-05 10:09:04

+0

它建議引發異常類型的異常。它是.NET中所有其他異常的基類型,您可能會引發更具體的異常類型或創建您自己的自定義異常。 – Arseny 2010-07-05 10:13:00

+0

我實際上認爲InvalidOperationException是一個適當的異常。來自InvalidOperationException的MSDN - 根據對象狀態對對象進行不適當的調用。 – 2010-07-05 21:09:28

回答

10

怎麼樣把這個邏輯爲Books財產支持了與私人領域books

public IEnumerable<Book> Books //or public IList<Book> Books 
{ 
    get 
    { 
     if(this.books == null) 
      throw new Exception("Books couldn't load because blah blah"); 
     return this.books; 
    } 
} 
+3

這是一個很好的模式,除了Exception類型。拋出一個子類型(例如'InvalidOperationException')或實現你自己的方法會更好。 – 2010-07-05 10:12:45

4

在你的書屬性,添加一個邏輯來檢查集合是否加載:

public List<Book> Books { get { 
    if (this.books == null) // or any other flag check 
    throw new InvalidOperationException("Books are not loaded."); 
    return this.books; 
} } 
+0

對異常類型的好評,System.Exception不應該被拋出。 – 2010-07-05 10:08:12

-1

Adrian修改後的示例:

public List<Book> Books { get { 
    if (this.books == null) // or any other flag check 
    throw new NullReferenceException("Books are not loaded."); 
    return this.books; 
} } 

如果嚴格從數據庫或某處獲取空值,則還可以在上例中使用拋出NullReferenceException。