2017-10-13 93 views
2

我無法弄清楚如何讓try catch工作。在文本框中輸入非數字時,需要彈出錯誤消息框。嘗試趕不工作

private void btnAdd_Click(object sender, EventArgs e) 

    { 
     int x = int.Parse(txtIn1.Text); 
     int y = int.Parse(txtIn2.Text); 

     txtIn1.Text = x.ToString(); 
     txtIn2.Text = y.ToString(); 

     lstOut.Items.Add((x + y).ToString("N0")); 

     try 
     { 
      int.Parse(txtIn1.Text); 
      int.Parse(txtIn2.Text); 

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

前2個'int.Parse'調用不在'try/catch'中。你也可以使用[TryParse](https://msdn.microsoft.com/en-us/library/f02979c7%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) –

+0

你叫'''int .Parse(txtIn1.Text);'''兩次,怎麼回事? –

+0

只需使用TryParse – maccettura

回答

4

經過最小的修改:將所有代碼移動到try中,以便捕獲任何異常時命中。您在try塊外面遇到您的異常。如果相應try塊中的某個內容拋出異常,您只會看到觸發事件。

private void btnAdd_Click(object sender, EventArgs e) { 
    try { 
     int x = int.Parse(txtIn1.Text); 
     int y = int.Parse(txtIn2.Text); 

     txtIn1.Text = x.ToString(); 
     txtIn2.Text = y.ToString(); 

     lstOut.Items.Add((x + y).ToString("N0")); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
     return; 
    } 
} 

編輯:正如評論者的建議,我覺得這個答案是沒有,說明一個try/catch塊是矯枉過正在這種情況下不完整的。

更好的方法是使用內置的TryParse方法(它可以返回關於解析嘗試成功和輸出值的布爾值)。這裏是你能做到這一點的一種方法:

private void btnAdd_Click(object sender, EventArgs e) { 
    var xSuccess = int.TryParse(txtIn1.Text, out int x); 
    var ySuccess = int.TryParse(txtIn2.Text, out int y); 

    if(!xSuccess) 
    MessageBox.Show($"{x} could not be parsed to int!"); 
    if(!ySuccess) 
    MessageBox.Show($"{y} could not be parsed to int!"); 

    if(xSuccess && ySuccess) 
    lstOut.Items.Add((x + y).ToString("N0")); 
} 
+1

當一個簡單的'int.TryParse()'就足夠了,而且沒有像try/catch那樣的開銷時,真的不應該使用try/catch – maccettura

+0

@maccettura 我同意你的評論。在這種情況下,我的目標是向他展示他的代碼的最小調整,以實現他的目標,以演示該塊如何實際運行。也許更好的解決方案是解釋塊如何執行並仍然使用TryParse代替Try/Catch。 感謝您的反饋 – Miek

+1

您可以隨時編輯您的問題,包括更好的做事方式。記住,SO不會回答問題。這也是一個學習機會。所以如果你看到OP可以做不同的事情,一定要讓他們知道! – maccettura

3

你不應該使用的try-catch作爲一個控制模塊在this SO post解釋。對此使用if。嘗試捕捉是真的意味着當你無法做其他事情,或當你發生發生事情時使用。

可以使用this SO post作爲一個例子,你的代碼看起來是這樣的

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    int x; 
    int y; 

    if(!int.TryParse(txtIn1.Text, out x) || !int.TryParse(txtIn2.Text, out y)) 
     MessageBox.Show("Parse failed !");   
} 

您可以使用

Console.WriteLine(x); 
Console.WriteLine(y); 

驗證瓦爾得到妥善給出的值

對於有關int.TryParse()方法的更多信息與int.Parse()請參閱this post

2

正如其他人所提到的,它是第一個讓事情脫節的int.Parse()函數 - Try/Catch塊之外的函數。

我想展開TryParse()函數 - 爲什麼應該使用它。

異常很貴 - 它們在時間/ CPU /等方面的開銷相當大。他們也不是用戶友好的。你想對用戶說「請輸入一個有效的數字」,而不是「發生異常:......」

而是,你可以使用TryParse,它返回解析是否工作;解析的輸出是輸入列表中的「out」參數:

​​

這並沒有異常的開銷 - 可以快速運行,無論輸入的有效。

1

爲什麼不使用不同的方法?

使用TextBox.KeyPress事件:

private void txtIn1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (!char.IsDigit(e.KeyChar) /* || add more conditions*/) 
     e.Handled = true; // Prevent key to be added to the TextBox' text. 
} 

現在你不必檢查是否有您的string是非數字。

您的陳述int.Parse(txtIn1.Text);肯定會奏效。