尝试赶不工作

问题描述:

我无法弄清楚如何让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

经过最小的修改:将所有代码移动到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

你不应该使用的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

正如其他人所提到的,它是第一个让事情脱节的int.Parse()函数 - Try/Catch块之外的函数。

我想展开TryParse()函数 - 为什么应该使用它。

异常很贵 - 它们在时间/ CPU /等方面的开销相当大。他们也不是用户友好的。你想对用户说“请输入一个有效的数字”,而不是“发生异常:......”

而是,你可以使用TryParse,它返回解析是否工作;解析的输出是输入列表中的“out”参数:

​​

这并没有异常的开销 - 可以快速运行,无论输入的有效。

为什么不使用不同的方法?

使用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);肯定会奏效。