2010-09-20 204 views
2

感謝大家幫我修復1位數和> 31個問題。C#程序崩潰

現在,最後一件事......如果一個文本框有非數字字符或根本沒有字符,程序將崩潰。

這裏是整個代碼:

private void generate_Click(object sender, EventArgs e) 
     { 
      int val = 0; 

      if (Int32.TryParse(dd.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (dd.Text.Length <= 1) 
        return; 
      } 

      if (Int32.TryParse(MM.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (MM.Text.Length <= 1) 
        return; 
      } 

      if (Int32.TryParse(hh.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (hh.Text.Length <= 1) 
        return; 
      } 

      if (Int32.TryParse(M.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (M.Text.Length <= 1) 
        return; 
      } 

      if (Int32.TryParse(ss.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (ss.Text.Length <= 1) 
        return; 
      } 

      String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text; 
      DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture); 
      long ticks = timestamp.Ticks; 
      long microseconds = ticks/10; 
      convertedText.Text = microseconds.ToString("X"); 
     } 

我拿什麼放? 我知道這有點亂...但它的工作原理,這是我的第一個C#應用程序:P 再次感謝!

+1

只是在想:'convertedText'包含自午夜12:00:00經過的微秒數,1月1日,0001這真的是你以後的事情嗎? – 2010-09-20 14:11:27

+0

是的,這是正確的:) – Mark 2010-09-20 17:00:14

回答

2

對於初學者,將代碼包裝在try catch塊中。它將防止異常自動崩潰程序。您可以捕獲異常並通知用戶輸入存在問題。

然後,你可以這樣做:

catch 
{ 
    MessageBox.Show("Please enter numbers only."); 
} 

真的在生產應用程序,你會想要做的更像是一個小趕上一個特定類型的錯誤。但是,開始時這樣做會很好。

+0

這是我會做到這一點。我喜歡嘗試捕捉循環 – Spooks 2010-09-20 14:53:10

0

這會解決您的特殊問題嗎?你正在做TryParsing,然後驗證大於31或小於1的整數,但如果TryParse失敗則無法處理。

private void generate_Click(object sender, EventArgs e) 
     { 
      int val = 0; 

      if (Int32.TryParse(dd.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (dd.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      if (Int32.TryParse(MM.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (MM.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      if (Int32.TryParse(hh.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (hh.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      if (Int32.TryParse(M.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (M.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      if (Int32.TryParse(ss.Text, out val)) 
      { 
       if (val > 31) return; 
       else if (ss.Text.Length <= 1) 
        return; 
      } 
      else 
      { 
       return; 
      } 

      String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text; 
      DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture); 
      long ticks = timestamp.Ticks; 
      long microseconds = ticks/10; 
      convertedText.Text = microseconds.ToString("X"); 
     } 
0

這將在ParseExact崩潰,如果dateString是不正確的格式。
改爲使用TryParseExact

5

如果你只是要返回如果日期不解析,那麼你可以跳過所有的驗證代碼,只需使用TryParseExact

private void generate_Click(object sender, EventArgs e) 
{ 
    String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text; 
    DateTime timestamp 
    if (!DateTime.TryParseExact(dateString, "yyyyddMMhhmmss", null, 
             DateTimeStyles.None, out timestamp)) 
     return;         
    long ticks = timestamp.Ticks; 
    long microseconds = ticks/10; 
    convertedText.Text = microseconds.ToString("X"); 
} 
0

我猜這是你的ParseExact崩潰此...但我並不完全確定......把所有東西都包裹起來,或者嘗試幾次。然後,你可以看到發生了什麼事情,並糾正它...

喜歡的東西:

try{ 
//Parse something... 

}catch(Exception ex) 
{ 
    throw ex; //I usually put a break point here when I'm debugging... 
}