-9

这是代码

    private void btngetage_Click(object sender, EventArgs e)
    {
        try
        {
            string a = txtAge.Text;
            DateTime bday = new DateTime(int.Parse(txtbday.Text));
            DateTime today = DateTime.Today;

            int age = today.Year - bday.Year;
            if (bday > today.AddYears(-age))
                age--;
            txtAge.Text = age.ToString();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
4

3 回答 3

4

当你做这样的事情时,

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

您使自己的调试更加困难。现在,调试器不会在包含错误的行上停止,而是根本不会停止。它只会显示您的消息框并继续前进,因为您已经处理了错误。

不要使用 catch 块,除非捕获您期望并要处理的异常。作为一个必然结果,永远不要抓住基Exception类,因为它有很多你永远无法处理的子类(比如OutOfMemoryException)。始终捕获特定的派生异常。

或者根本不捕获任何异常。如有必要,您可以使用一个全局未处理的异常处理程序。默认情况下,它将显示一个警报,其中包含有关异常的信息。(这与上面的代码基本上是一样的,除了更好。)

一旦你取出那个毫无价值的 catch 块,调试器将在这一行停止:

DateTime bday = new DateTime(int.Parse(txtbday.Text));

它会告诉您该int.Parse方法正在引发异常以及它是哪种类型的异常。您将了解到输入 ( txtbday.Text) 不是有效整数,因此无法转换为整数。

您可以通过捕获FormatException和处理错误来解决此问题,但没有理由这样做,因为TryParse提供了一种不会引发任何异常的方法。相反,它返回一个表示成功或失败的布尔值。使用 if 语句进行测试。如果无法解析字符串,请使用ErrorProvider组件提醒用户输入的字符串存在问题。

于 2013-08-06T15:23:31.467 回答
1

您试图在这里解析一个无效的整数:

int.Parse(txtbday.Text)

尝试改用它

DateTime.Parse(txtbday.Text)

为了防止异常,最好使用DateTime.TryParse方法:

DateTime bday;
if (DateTime.TryParse(txtbday.Text, out bday))
{
    int age = today.Year - bday.Year;
    if (bday > today.AddYears(-age))
        age--;
    txtAge.Text = age.ToString();
}
于 2013-08-06T15:20:42.470 回答
0

而不是这个

DateTime bday = new DateTime(int.Parse(txtbday.Text));

你应该这样做,尽管这是我能从你的问题中得到的全部信息。

DateTime bday;
if(DateTime.TryParse(txtbday.Text.Trim(),out bday))
{
    //your rest of code
}

注意: 文本框控件应该用于进行文本输入。对于日期时间输入,将控件更改为日期时间选择器。您不必进行任何解析。

于 2013-08-06T15:19:05.843 回答