【问题标题】:Try catch not showing error message for formatException尝试捕获不显示 formatException 的错误消息
【发布时间】:2019-02-25 03:16:46
【问题描述】:

我正在尝试从文本框中捕获 FormatException。例如 - 如果用户在名称文本框字段中输入数字或任何其他字符。将弹出消息 - 出了点问题。我对 C# 相当陌生,我不了解异常的概念。下面不起作用。无效格式的正确例外是什么?

private void button1_Click(object sender, EventArgs e)
{
try
{
    string name = textBox1.Text;
    int age = int.Parse(textBox2.Text);

}
catch (FormatException )
{
    MessageBox.Show("Something went wrong");
}

【问题讨论】:

  • 您在textBox1textBox2 中输入了什么值?
  • 你想在 MessageBox 中看到什么消息?
  • Try catch 在按钮点击时被调用。我在文本框 1 中输入名称,该名称必须是字符串格式,否则我想显示消息框说“出了点问题”。
  • 您没有对textBox1.Text 进行任何验证。这就是为什么您没有收到错误的原因。如果您希望用户只输入字符串值(而不是数字),您可以通过多种方式实现它。检查This Anwser
  • 请举例说明。描述您在两个文本框中输入的内容。并告诉我们您的预期结果和实际结果。我要求这个是因为不清楚你想要发生什么。如果我不得不猜测,此时,您似乎想禁止某人在“姓名”文本框中输入数字。那正确吗?你知道如果你传递一个空字符串 int.Parse 会抛出一个异常吗?当您单击按钮时,您的 textBox2 可能只是空的,这就是发生异常的原因 - 因为 textBox2.Text 是空的。

标签: c# exception-handling


【解决方案1】:

试试这个来显示消息。

    try
        {
            double mydoubleParam = 0;
            // Assuming textBox1.Text is Name test box
            if (double.TryParse(textBox1.Text, out mydoubleParam))
            {
                 new Exception(" Numeric value in name field");
            }

            int age = int.Parse(textBox2.Text);// Assuming Number text box

            MessageBox.Show("How are you today?");
        }

        catch (FormatException ex)
        {
            MessageBox.Show("Something went wrong");
        }

【讨论】:

  • 如果 textBox1 的值为 "Am123t" .. 是否有效?如果不是,您的代码运行不正常。
【解决方案2】:

您可以像这样在 TextChanged 事件中处理它:

private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int a;
            bool isNumeric = int.TryParse(textBox1.Text, out a);
            if (isNumeric)
            {
                MessageBox.Show("Something went wrong");
            }
        }

【讨论】:

  • 即使我怀疑它是否完美,这个答案是有道理的 +1 - 只需添加代码以避免所有其他非字母字符,并确保它们不会附加到 textBox 的文本字符串之后此验证。
【解决方案3】:
 catch (FormatException  ex)
    {
       MessageBox.Show("Something went wrong " + ex.ToString() );
    }

在 Catch 中使用 ex 作为变量。

更新(根据评论)

 catch (FormatException  ex)
{
   MessageBox.Show("Something went wrong !");
}

【讨论】:

  • 是否可以只显示双引号内的消息?
  • 要求:“例如 - 如果用户在名称文本框字段中输入数字。消息将弹出 - 出错了。”
  • ex 传递到处理程序与问题有什么关系?
【解决方案4】:

如果您需要检查名称文本框中的数字,那么:

try {
        string name = textBox1.Text;
        Regex regex = new Regex("[0-9]");
        if (regex.IsMatch(name)) {
            throws new FormatException();
        }
        int age = int.Parse(textBox2.Text);
        MessageBox.Show("How are you today?");
    }
    catch (FormatException) {
       MessageBox.Show("Something went wrong");
    }

您还应该针对每种情况显示更具体的消息。

更新

你真正应该做的是:

var regex = new Regex("[0-9]");
if (regex.IsMatch(textBox1.Text)) {
    MessageBox.Show("There was a number inside name textbox.","Error in name field!");
    return;
}
try {
    Convert.ToInt32(textBox2.Text);
} catch (Exception) {
    MessageBox.Show("The input in age field was not valid","Error in name field!");
    return;
}

【讨论】:

  • 要求:“例如 - 如果用户在名称文本框字段中输入数字。消息将弹出 - 出错了。”
  • @Amit - 我怀疑 OP 打错了要求。我相当肯定他的意思正好相反。
  • 你的正则表达式被破坏了,抛出FormatException 没什么意义,因为这就是int.Parse 无论如何都会做的。您发布的代码不正确,只会增加臃肿。
  • @Enigmativity 在评论部分也证实了这一点。“尝试在单击按钮时调用 catch。我在文本框 1 中输入名称,该名称必须是字符串格式,否则我想显示消息框说“出了点问题” ..但是我并没有否决这个答案,而是希望根据正确的要求对其进行修改。
  • @Amit - 我已经要求 OP 确认。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2020-01-21
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
相关资源
最近更新 更多