不要認爲這是可能的,但認爲我會問,也許有人可能會建議一種替代技術或模式。C#在運行時返回異常
假設我有一個客戶類,它的書籍列表都是從外部來源單獨提取的。如果客戶類是全成,但圖書無法加載,我不想拋出異常,除非客戶端嘗試訪問書籍屬性,以便..
this.Books = new List<Book>()
{
throw new Exception("Books couldn't load because blah blah");
};
是沿着這些線路可能的東西嗎?
不要認爲這是可能的,但認爲我會問,也許有人可能會建議一種替代技術或模式。C#在運行時返回異常
假設我有一個客戶類,它的書籍列表都是從外部來源單獨提取的。如果客戶類是全成,但圖書無法加載,我不想拋出異常,除非客戶端嘗試訪問書籍屬性,以便..
this.Books = new List<Book>()
{
throw new Exception("Books couldn't load because blah blah");
};
是沿着這些線路可能的東西嗎?
怎麼樣把這個邏輯爲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;
}
}
這是一個很好的模式,除了Exception類型。拋出一個子類型(例如'InvalidOperationException')或實現你自己的方法會更好。 – 2010-07-05 10:12:45
在你的書屬性,添加一個邏輯來檢查集合是否加載:
public List<Book> Books { get {
if (this.books == null) // or any other flag check
throw new InvalidOperationException("Books are not loaded.");
return this.books;
} }
對異常類型的好評,System.Exception不應該被拋出。 – 2010-07-05 10:08:12
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。
順便說一句,FCL有這樣的情況下的一些特殊類 - 'ArgumentException','ArgumentNullException'和'ArgumentOutOfRangeException' – abatishchev 2010-07-05 10:09:04
它建議引發異常類型的異常。它是.NET中所有其他異常的基類型,您可能會引發更具體的異常類型或創建您自己的自定義異常。 – Arseny 2010-07-05 10:13:00
我實際上認爲InvalidOperationException是一個適當的異常。來自InvalidOperationException的MSDN - 根據對象狀態對對象進行不適當的調用。 – 2010-07-05 21:09:28