C# 定制異常
在應(yīng)用程序中,有時(shí)也可以從這個(gè)基類中派生自己的異常類,并使用它們,而不是使用標(biāo)準(zhǔn)的異常。這樣就可以把更具體的信息發(fā)送給捕獲該異常的代碼,讓處理異常的捕獲代碼更有針對(duì)性。例如,可以給異常類添加一個(gè)新屬性,以便訪問(wèn)某些底層信息,這樣異常的接收代碼就可以做出必要的改變,或者僅給出異常起因的更多信息。
給CardLib添加定制異常
為演示定制異常的用法,最好通過(guò)升級(jí)CardLib項(xiàng)目來(lái)說(shuō)明。目前,如果試圖訪問(wèn)索引小于0或大于51的撲克牌,Deck.GetCard()方法就會(huì)拋出一個(gè)標(biāo)準(zhǔn)的.NET異常,但下面改為使用一個(gè)定制異常。
首先需要在BeginningCSharp7\Chapterl3目錄中創(chuàng)建一個(gè)新的類庫(kù)項(xiàng)目Chl3CardLib,像以前一樣把類從 ChI2CardLib中復(fù)制過(guò)來(lái),并把名稱空間改為Chl3CanlLib。接著定義該異常。方法是使用在新類文件 CardOutOfRangeException.cs中定義的一個(gè)新類,這個(gè)新類是使用Project | Add Class命令添加到Chl3CardLib 項(xiàng)目中的(這段代碼包含在Chl3CardLib\CardOutOfRangeException.cs文件中):
public class CardOutOfRangeException : Exception
{
private Cards deckContents;
public Cards DeckContents
{
get { return deckContents; }
}
public CardOutOfRangeException(Cards sourceDeckContents)
:base(uThere are only 52 cards in the deck.")
{
deckContents = sourceDeckContents;
}
}
這個(gè)類的構(gòu)造函數(shù)需要使用Cards類的一個(gè)實(shí)例,它允許通過(guò)DeckContents屬性來(lái)訪問(wèn)這個(gè)Cads對(duì)象,為Exception基類構(gòu)造函數(shù)提供合適的錯(cuò)誤信息,使該錯(cuò)誤信息可以通過(guò)類的Message屬性得到。
接著在Deck.cs中添加拋出該異常的代碼,替換原來(lái)的標(biāo)準(zhǔn)異常(這段代碼包含在Chl3CardLib\Deck.cs文件中):
public Card GetCard(int cardNum)
{
if (cardNum >= 0 && cardNum <= 51)
return cards[cardNum];
else
throw new CardOutOfRangeException(cards.Clone() as Cards);
}
CardOutOfRangeException類的DeckContents屬性是通過(guò)對(duì)Deck對(duì)象的當(dāng)前內(nèi)容(其形式是一個(gè)Cards對(duì)象)進(jìn)行深度復(fù)制來(lái)初始化的。這表示,此時(shí)的內(nèi)容是異常拋出時(shí)的內(nèi)容,所以隨后對(duì)Deck內(nèi)容的修改不會(huì)丟失這些信息。
要進(jìn)行測(cè)試,使用下面的客戶端代碼(這段代碼包含在Chl3CardClientVProgram.cs文件中):
Deck deckl = new Deck{);
try
{
Card myCard = deckl.GetCard(60);
}
catch (CardOutOfRangeException e)
{
WriteLine(e.Message);
WriteLine(e.DeckContents[0]);
}
ReadKey();
添加對(duì) Chl3CardLib.cm、using static System.Console 和 using Chi3CardLib 的引用后,執(zhí)行代碼,結(jié)果如圖所示。
其中捕獲代碼把異常的Message屬性寫到屏幕上。我們還通過(guò)DeckContents顯示了Cards對(duì)象中的第一張牌,以證明可以通過(guò)定制的異常對(duì)象來(lái)訪問(wèn)Cards集合。
點(diǎn)擊加載更多評(píng)論>>