尝试赶不工作
我无法弄清楚如何让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;
}
经过最小的修改:将所有代码移动到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"));
}
当一个简单的'int.TryParse()'就足够了,而且没有像try/catch那样的开销时,真的不应该使用try/catch – maccettura
@maccettura 我同意你的评论。在这种情况下,我的目标是向他展示他的代码的最小调整,以实现他的目标,以演示该块如何实际运行。也许更好的解决方案是解释块如何执行并仍然使用TryParse代替Try/Catch。 感谢您的反馈 – Miek
您可以随时编辑您的问题,包括更好的做事方式。记住,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);
肯定会奏效。
前2个'int.Parse'调用不在'try/catch'中。你也可以使用[TryParse](https://msdn.microsoft.com/en-us/library/f02979c7%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) –
你叫'''int .Parse(txtIn1.Text);'''两次,怎么回事? –
只需使用TryParse – maccettura