0

如果在 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;
    }
}

编辑:这是创建对象的代码。这是我应该放置 try catch 块的地方吗?

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

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

再次: 问题是......为什么当我输入高于 2011 的内容时它不抛出异常?

4

5 回答 5

2

好吧,异常是从LibraryBook类的构造函数中抛出的——但你没有在任何地方调用它。您正在将年份数字从字符串转换为整数。没有理由在那里提出例外。

于 2011-11-14T08:36:30.607 回答
1

您的一个解决方案是从您的 try 块创建一个 LibraryBook 对象,以便在构造函数中验证数据。

把它放在你的尝试中:

var b = new LibraryBook(textBoxTitle.Text, textBoxAuthor.Text, int.Parse(textBoxCopyrightYear.Text));
于 2011-11-14T08:40:08.860 回答
0

你打电话int.TryParse。如果此方法无法解析该值,则此方法返回 false - 它永远不会抛出异常。如果你想有一个例外,你必须采取int.Parse(). 但是这个方法永远不会抛出你的自定义异常CopyrightYearOutOfRange

于 2011-11-14T08:37:02.043 回答
0

因为您没有在这里创建 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 中的文本是否为整数值

于 2011-11-14T08:39:10.827 回答
0
try
{
    // Is this where I'm making a mistake?
    int.TryParse(textBoxCopyrightYear.Text, out year);
}

确切地说,您在这里解析一个整数,而不是实例化 LibraryBook。所以你的验证代码不会被执行,你的异常也不会被抛出。

在您的情况下,您不需要在构造函数中使用此类验证,因为您只需ifint.TryParse.

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
        );
于 2011-11-14T08:39:21.780 回答