簡體   English   中英

C#Windows窗體自定義異常問題

[英]C# Windows Forms custom exception problems

我試圖讓它拋出異常,如果在TextBoxCopyrightYear.Text中輸入的年份高於當前年份,但它似乎沒有這樣做。

問題是...當我輸入高於2011的值時,為什么不拋出異常?

我創建了自定義異常類CopyrightYearOutOfRange:

public class CopyrightYearOutOfRange : Exception
{
    private LibraryBook book;
    private int year;

    public CopyrightYearOutOfRange(LibraryBook book, int year)
        : base("Year is beyond current year. This is impossible.")
    {
        this.book = book;
        this.year = year;
    }

    public LibraryBook Book { get { return book; } }
    public int Year { get { return year; } }

    public CopyrightYearOutOfRange(string message)
        : base(message)
    { 
    }
}

在本節的我的LibraryBook類中,它是這樣拋出的:

public LibraryBook(string title, string author, int copyrightYear)
{
    Title = title;
    Author = author;
    if (isValidYear(copyrightYear))
    {
        CopyrightYear = copyrightYear;
    }
    else
    {
        throw new CopyrightYearOutOfRange(this, copyrightYear);
    }
}

private bool isValidYear(int year)
{
    return year <= 2011;
}

所以我創建了這段代碼來檢查用戶輸入是否有效...

// makes sure data is valid...
private bool validateData()
{
    int year;
    int errorCount = 0;
    string errorHeader = "";
    string errorMessage = "";
    string errorTitle = "";
    string plural = "";

    if (textBoxTitle.Text.Length == 0)
    {
        errorMessage += "\nEnter a title";
        errorCount++;
    }

    if (!int.TryParse(textBoxCopyrightYear.Text, out year) || year < 1)
    {
        errorMessage += "\nEnter year as a positive number";
        errorCount++;
    }
    else
    {
        try
        {
            // Is this where I'm making a mistake?
            int.TryParse(textBoxCopyrightYear.Text, out year);
        }
        catch (CopyrightYearOutOfRange ex)
        {
            MessageBox.Show(
                string.Format("{0}", ex.Message)
                , "Copyright out of range exception"
                , MessageBoxButtons.OK
                , MessageBoxIcon.Exclamation
                );
        }
    }

這是確定按鈕代碼:

private void buttonOK_Click(object sender, EventArgs e)
{
    if (validateData())
    {
        controlsToObject();
        this.DialogResult = DialogResult.OK;
    }
}

編輯:這是創建對象的代碼。 這是我應該放置嘗試捕獲塊的地方嗎?

    private void controlsToObject()
    {
        if (libraryBook == null)
        {
            libraryBook = new LibraryBook();
        }

        libraryBook.Title = textBoxTitle.Text;
        libraryBook.Author = textBoxAuthor.Text;
        libraryBook.CopyrightYear = int.Parse(textBoxCopyrightYear.Text);
    }

再次: 問題是...當我輸入高於2011的值時,為什么不拋出異常?

好吧,該異常是從LibraryBook類的構造函數引發的,但是您不會在任何地方調用它。 您正在將年份數字從字符串轉換為整數。 沒有理由在那里提出例外。

一種解決方案是從try塊創建LibraryBook對象,以便在構造函數中驗證數據。

嘗試一下:

var b = new LibraryBook(textBoxTitle.Text, textBoxAuthor.Text, int.Parse(textBoxCopyrightYear.Text));

您調用int.TryParse 如果無法解析該值,則此方法返回false-永遠不會引發異常。 如果要發生異常,則必須采用int.Parse() 但是此方法永遠不會拋出您的自定義異常CopyrightYearOutOfRange

因為您不在此處創建LibraryBook實例,所以:

        try
        {
            int.TryParse(textBoxCopyrightYear.Text, out year);
        }
        catch (CopyrightYearOutOfRange ex)
        {
            MessageBox.Show(
                string.Format("{0}", ex.Message)
                , "Copyright out of range exception"
                , MessageBoxButtons.OK
                , MessageBoxIcon.Exclamation
                );
        }

您只需檢查textBoxCopyrightYear中的文本是否為整數值

try
{
    // Is this where I'm making a mistake?
    int.TryParse(textBoxCopyrightYear.Text, out year);
}

確實,您是在這里解析一個整數,而不是實例化LibraryBook。 因此,不會執行您的驗證代碼,並且永遠不會引發異常。

在您的情況下,您不需要在構造函數中使用這種驗證,因為您可以在int.TryParse之后添加if子句。

if(int.TryParse(textBoxCopyrightYear.Text, out year))
if(!isValidYear(year))
    MessageBox.Show(
        string.Format("{0}", ex.Message)
        , "Copyright out of range exception"
        , MessageBoxButtons.OK
        , MessageBoxIcon.Exclamation
        );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM