位置:首頁(yè) > 軟件操作教程 > 編程開發(fā) > C# > 問(wèn)題詳情

C# 定制異常

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-08

    在應(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é)果如圖所示。

image.png

其中捕獲代碼把異常的Message屬性寫到屏幕上。我們還通過(guò)DeckContents顯示了Cards對(duì)象中的第一張牌,以證明可以通過(guò)定制的異常對(duì)象來(lái)訪問(wèn)Cards集合。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部