简体   繁体   中英

C# program crash

Thanks guys for helping me to fix the 1 digit and >31 problems.

Now, one last thing... if a textbox has non-numeric characters or no characters at all, the program will crash.

here's the whole code:

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");
        }

What shall I put? I know it's a bit messy... but it works and it's my first C# application :P Thanks again!

If you are just going to return if the date does not parse, then you can skip all of the validation code and just use 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"); 
}

For starters, wrap your code in a try catch block. It will prevent the exception from automatically crashing the program. You can catch the exception and notify the user there is a problem with the input.

Then you can do something like:

catch
{
   MessageBox.Show("Please enter numbers only.");
}

Really in a production app, you'd want to do a little more like catch a specific type of error. But for starting out this will do just fine.

Will this solve your particular problem? you're doing TryParsing and then validating the integer with greater than 31 or less than 1 but not handling if the TryParse fails.

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");
        }

It would crash on ParseExact if dateString is not in the correct format.
Use TryParseExact instead.

I would guess its your ParseExact crashing this...But I'm not totally sure... Wrap everything in a try catch or several try catches. Then you can see what's going on and correct it...

Something like:

try{
//Parse something...

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM