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
                );
        }
    }

ここにOKボタンのコードがあります:

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 に答える