2013-08-06 40 views
-8

這裏的代碼如何調試此錯誤? 「輸入字符串的不正確的格式」

private void btngetage_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      string a = txtAge.Text; 
      DateTime bday = new DateTime(int.Parse(txtbday.Text)); 
      DateTime today = DateTime.Today; 

      int age = today.Year - bday.Year; 
      if (bday > today.AddYears(-age)) 
       age--; 
      txtAge.Text = age.ToString(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
+0

檢查'txtbday.Text'的值。 –

+9

爲什麼地球上你首先解析爲「int」? –

+2

'txtbday的值是多少?Text'?這是你的意圖嗎?由於*確切*輸入,你期望什麼結果? – abelenky

回答

0

,而不是這個

DateTime bday = new DateTime(int.Parse(txtbday.Text)); 

你應該這樣做,但它是所有我可以從你的問題得到。

DateTime bday; 
if(DateTime.TryParse(txtbday.Text.Trim(),out bday)) 
{ 
    //your rest of code 
} 

注:文本框控制應該用於拍攝文本輸入。對於日期時間輸入,將控件更改爲日期時間選擇器。你不必做任何解析。

1

您試圖解析這裏無效整數

int.Parse(txtbday.Text) 

嘗試使用此代替

DateTime.Parse(txtbday.Text) 

要防止異常,最好使用DateTime.TryParse方法:

DateTime bday; 
if (DateTime.TryParse(txtbday.Text, out bday)) 
{ 
    int age = today.Year - bday.Year; 
    if (bday > today.AddYears(-age)) 
     age--; 
    txtAge.Text = age.ToString(); 
} 
4

當你做這樣的事情時,

catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

你使自己的調試更加困難。現在,不是停止在包含錯誤的行上,調試器根本不會停止。它只是顯示你的消息框並繼續前進,因爲你已經處理了錯誤。

不要使用catch塊來捕獲您期望並將要處理的異常。作爲一個必然結果,從來沒有趕上基類Exception類,因爲它有很多子類,你將永遠無法處理(如OutOfMemoryException)。始終捕捉特定的派生異常。

或者根本沒有發現任何異常。有一個全局的未處理異常處理程序,您可以根據需要使用它。默認情況下,它將顯示一條警報,其中包含有關該異常的信息。 (基本上是上面的代碼呢,同樣的事情,除了要好得多。)

一旦你採取的是不值錢的catch塊了,調試器將停止在這一行:

DateTime bday = new DateTime(int.Parse(txtbday.Text)); 

它會告訴你int.Parse方法拋出一個異常,它是哪種類型的異常。您將瞭解到輸入(txtbday.Text)不是有效整數,因此無法轉換爲整數。

您可以通過獲取FormatException並處理錯誤來解決此問題,但沒有理由這樣做,因爲有一個TryParse提供的方法不會拋出任何異常。相反,它會返回一個表示成功或失敗的布爾值。用if語句測試一下。如果無法解析字符串,請使用ErrorProvider組件以用戶輸入的字符串警告用戶問題。