首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试着接住不工作

试着接住不工作
EN

Stack Overflow用户
提问于 2017-10-13 18:17:26
回答 4查看 494关注 0票数 2

我想不出怎样才能让试捕器开始工作。在文本框中输入非数字时,需要有一个错误消息框弹出。

代码语言:javascript
复制
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;
        }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-10-13 18:20:11

只需进行最少的修改:将所有代码移到try中,这样当任何异常被击中时,它都会捕获。在try块之外遇到异常。只有在相应的try块中发生了抛出异常时,才会看到捕获被触发。

代码语言:javascript
复制
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方法(它可以返回一个关于解析尝试成功的布尔值和一个输出值)。以下是您实现这一目标的一种方法:

代码语言:javascript
复制
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"));
}
票数 4
EN

Stack Overflow用户

发布于 2017-10-13 18:30:13

您不应该像在this SO post中解释的那样,使用try-catch作为控制块。为此请使用if。尝试捕捉实际上是指当您不能进行其他操作时,或者当没有预料到发生时,才使用它。

可以使用this SO post作为示例,您的代码可以如下所示

代码语言:javascript
复制
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 !");          
}

您可以使用

代码语言:javascript
复制
Console.WriteLine(x);
Console.WriteLine(y);

来验证vars是否正确地被赋予了一个值。

有关int.TryParse()方法与int.Parse()的更多信息,请参见this post

票数 3
EN

Stack Overflow用户

发布于 2017-10-13 18:31:10

正如其他人所提到的,这是第一个int.Parse()函数,在Try/Catch块之外。

我想对TryParse()函数进行扩展--以及为什么应该使用它。

异常是昂贵的--就时间/CPU/等等而言,它们是相当大的开销。它们也不适合用户使用。您想对用户说“请输入一个有效的号码”,而不是“发生了异常:.”

相反,您可以使用TryParse,它返回解析是否有效;解析的输出是输入列表中的"out“参数:

代码语言:javascript
复制
int myValue;
bool parseWorked = int.TryParse("3", out myValue);

这没有异常开销--无论输入是否有效,它都会快速运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46735854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档