C # Windows Forms проблемы с пользовательскими исключениями - PullRequest
0 голосов
/ 14 ноября 2011

Я пытаюсь заставить это выдать исключение, если год введен в 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?

Ответы [ 5 ]

2 голосов
/ 14 ноября 2011

Ну, исключение выдается из конструктора класса LibraryBook - но вы его нигде не вызываете. Вы переводите номер года из строки в int. Нет причин для исключения там.

1 голос
/ 14 ноября 2011

Решением для вас является создание объекта LibraryBook из вашего блока try, чтобы данные проверялись в конструкторе.

вставь это в свою попытку:

var b = new LibraryBook(textBoxTitle.Text, textBoxAuthor.Text, int.Parse(textBoxCopyrightYear.Text));
0 голосов
/ 14 ноября 2011
try
{
    // Is this where I'm making a mistake?
    int.TryParse(textBoxCopyrightYear.Text, out year);
}

Точно, вы анализируете здесь целое число, а не создаете экземпляр LibraryBook. Таким образом, ваш код проверки не выполняется, а ваше исключение никогда не генерируется.

В вашем случае вам не нужно использовать такую ​​проверку в конструкторе, потому что вы можете просто добавить if предложение после int.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
        );
0 голосов
/ 14 ноября 2011

Поскольку здесь вы не создаете экземпляр 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 целочисленным значением

0 голосов
/ 14 ноября 2011

Звоните int.TryParse.Этот метод возвращает false, если он не может проанализировать значение - он никогда не вызовет исключение.Если вы хотите получить исключение, вы должны взять int.Parse(). Но этот метод никогда не выдаст ваше исключение CopyrightYearOutOfRange!

...