Mark
Mark

Reputation: 557

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!

Upvotes: 2

Views: 387

Answers (5)

Jason
Jason

Reputation: 11615

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...
}

Upvotes: 0

D&#39;Arcy Rittich
D&#39;Arcy Rittich

Reputation: 171569

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

Upvotes: 5

Itay Karo
Itay Karo

Reputation: 18306

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

Upvotes: 0

Chris Conway
Chris Conway

Reputation: 16529

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

Upvotes: 0

kemiller2002
kemiller2002

Reputation: 115538

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.

Upvotes: 2

Related Questions