C#程序崩溃

C#程序崩溃,c#,C#,感谢各位帮助我解决1位数和>31的问题 现在,最后一件事。。。如果文本框包含非数字字符或完全没有字符,程序将崩溃 以下是全部代码: private void generate_Click(object sender, EventArgs e) { int val = 0; if (Int32.TryParse(dd.Text, out val)) { if (val >

感谢各位帮助我解决1位数和>31的问题

现在,最后一件事。。。如果文本框包含非数字字符或完全没有字符,程序将崩溃

以下是全部代码:

private void generate_Click(object sender, EventArgs e)
        {
            int val = 0;

            if (Int32.TryParse(dd.Text, out val))
            {
                if (val > 31) return;
                else if (dd.Text.Length <= 1)
                    return;
            }

            if (Int32.TryParse(MM.Text, out val))
            {
                if (val > 31) return;
                else if (MM.Text.Length <= 1)
                    return;
            }

            if (Int32.TryParse(hh.Text, out val))
            {
                if (val > 31) return;
                else if (hh.Text.Length <= 1)
                    return;
            }

            if (Int32.TryParse(M.Text, out val))
            {
                if (val > 31) return;
                else if (M.Text.Length <= 1)
                    return;
            }

            if (Int32.TryParse(ss.Text, out val))
            {
                if (val > 31) return;
                else if (ss.Text.Length <= 1)
                    return;
            }

            String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text;
            DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture);
            long ticks = timestamp.Ticks;
            long microseconds = ticks / 10;
            convertedText.Text = microseconds.ToString("X");
        }
private void生成\u单击(对象发送方,事件参数e)
{
int-val=0;
if(Int32.TryParse(dd.Text,out val))
{
如果(val>31)返回;
如果(dd.Text.Length 31)返回,则返回;
否则,如果(MM.Text.Length 31)返回;
else if(hh.Text.Length 31)返回;
否则,如果(M.Text.Length 31)返回;

否则,如果(ss.Text.Length对于初学者,请将代码包装在块中。这将防止异常自动导致程序崩溃。您可以捕获异常并通知用户输入有问题

然后,您可以执行以下操作:

catch
{
   MessageBox.Show("Please enter numbers only.");
}
try{
//Parse something...

}catch(Exception ex)
{
    throw ex; //I usually put a break point here when I'm debugging...
}

实际上,在生产应用程序中,您可能更希望捕获特定类型的错误。但对于启动来说,这将很好。

这能解决您的特定问题吗?您正在执行TryParse,然后验证大于31或小于1的整数,但如果TryParse失败,则不进行处理

private void generate_Click(object sender, EventArgs e)
        {
            int val = 0;

            if (Int32.TryParse(dd.Text, out val))
            {
                if (val > 31) return;
                else if (dd.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            if (Int32.TryParse(MM.Text, out val))
            {
                if (val > 31) return;
                else if (MM.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            if (Int32.TryParse(hh.Text, out val))
            {
                if (val > 31) return;
                else if (hh.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            if (Int32.TryParse(M.Text, out val))
            {
                if (val > 31) return;
                else if (M.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            if (Int32.TryParse(ss.Text, out val))
            {
                if (val > 31) return;
                else if (ss.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text;
            DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture);
            long ticks = timestamp.Ticks;
            long microseconds = ticks / 10;
            convertedText.Text = microseconds.ToString("X");
        }
private void生成\u单击(对象发送方,事件参数e)
{
int-val=0;
if(Int32.TryParse(dd.Text,out val))
{
如果(val>31)返回;
如果(dd.Text.Length 31)返回,则返回;
否则,如果(MM.Text.Length 31)返回;
else if(hh.Text.Length 31)返回;
否则,如果(M.Text.Length 31)返回;

else if(ss.Text.Length如果
ParseExact
的日期字符串格式不正确,它将崩溃。

改为使用
TryParseExact

如果日期未解析,您只需返回,则可以跳过所有验证代码,只需使用
TryParseExact

private void generate_Click(object sender, EventArgs e) 
{ 
    String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text; 
    DateTime timestamp 
    if (!DateTime.TryParseExact(dateString, "yyyyddMMhhmmss", null, 
                                       DateTimeStyles.None, out timestamp ))
        return;                                   
    long ticks = timestamp.Ticks; 
    long microseconds = ticks / 10; 
    convertedText.Text = microseconds.ToString("X"); 
}

我猜是你的
ParseExact
使这个崩溃了…但我不完全确定…将所有内容都包装在一个或多个try-catch中。然后你可以看到发生了什么并更正它

比如:

catch
{
   MessageBox.Show("Please enter numbers only.");
}
try{
//Parse something...

}catch(Exception ex)
{
    throw ex; //I usually put a break point here when I'm debugging...
}

只是想知道:
convertedText
包含自0001年1月1日午夜12:00:00以来经过的微秒数。这真的是你想要的吗?这就是我要做的。我喜欢尝试捕捉循环