[英]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.