我无法弄清楚如何让try catch工作。在文本框中输入非数字时,需要弹出一个错误消息框。
border-radius: 4px;
border-left: 5px solid red;
答案 0 :(得分:4)
通过最少的修改:将所有代码移动到try中,以便在遇到任何Exception时捕获它。您在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 :(得分: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);
验证vars是否正确赋值
有关int.TryParse()
方法与int.Parse()
的详细信息,请参阅this post
答案 2 :(得分:2)
正如其他人所提到的,它是第一个使事情绊倒的int.Parse()函数 - 在Try / Catch块之外的那些函数。
我想扩展TryParse()函数 - 为什么应该使用它。
例外是昂贵的 - 它们在时间/ CPU /等方面是一个相当大的开销。他们也不是用户友好的。你想说"请输入一个有效的号码"对于用户,而不是"发生了异常:..."
相反,您可以使用TryParse,它返回解析是否有效;解析的输出是" out"输入列表中的参数:
int myValue;
bool parseWorked = int.TryParse("3", out myValue);
这不会产生异常开销 - 无论输入是否有效,它都会快速运行。
答案 3 :(得分: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);
肯定会奏效。