6.5. Errors and User Input¶
In our last example, we asked the user to provide us with a temperature value in Celsius.
As programmers, we all hope that our message "Temp in degrees C:"
would be clear enough
to have the user enter a numeric value. However, things happen.
Have you tried your code with a non-numeric "Temp in degrees C:"
value?
Let’s look at what happens if a user were to enter non-numeric data. This is where we left our program at the end of the last section.
1 2 3 4 5 | Console.WriteLine("Temp in degrees C:");
string degreesC = Console.ReadLine();
double degreesCDouble = Double.Parse(degreesC);
double degreesK = degreesCDouble + 273.15;
Console.WriteLine("Degrees K: " + degreesK);
|
Running this with an input of the string "one hundred"
gives the output:
Unhandled Exception:
System.FormatException: Input string was not in a correct format.
In Line 3, we are converting our user input into a double data type. A double data type can only be numbers, whole or decimals. Anything else is unexpected and will cause your code to stop working. That type of message does not provide any feedback to your user for a second attempt.
Is there anything you can do about this? Yes.
6.5.1. TryParse
¶
The TryParse
method can be used here to handle this type of exception.
TryParse
uses booleans and conditionals to verify that the correct input data type has been entered, and then allows
you to create options based on the data. This can be a helpful way to prompt the user for the desired data type.
Example
1 2 3 4 5 6 7 8 9 10 11 12 13 | Console.WriteLine("Temp in degrees C:");
string degreesC = Console.ReadLine();
double degreesCDouble;
if (Double.TryParse(degreesC, out degreesCDouble))
{
double degreesK = degreesCDouble + 273.15;
Console.WriteLine("Degrees K: " + degreesK);
}
else
{
Console.WriteLine("Please enter a numeric value.");
}
|
Running this with an input of the word "one hundred"
gives the output:
Please enter a numeric value.
If the in input was "100"
then the output would be:
Degress K: 373.15
6.5.1.1. TryParse
and out
¶
TryParse
method uses the keyword out
.
In this instance, out
reassigns our string value for a valid numeric value, which will be stored in the degreesCDouble
variable in Line 3.
Let’s see how TryParse
and out
work.
Line 1, we print the prompt asking the user to provide a temperature reading.
Line 2,
degreesC
is initialized once the user puts in their value.Line 3,
degreesCDouble
is declared, but not initialized.Line 5, we take
degreesC
and attempt to parse it into a double.
If this is true, then a lot of things happen.
First, since the input is a valid double,
TryParse
will assign the parsed value todegreesCDouble
via theout
keyword, thereby initializing it.Second, the
degreesCDouble
variable is initialized.Third,
degreesCDouble
is used in Line 7 to initializedegreesK
.Finally, Line 8 prints our results.
If Line 5 is false, then TryParse
is not able to assign any values.
When this happens the else
clause is triggered, and Line 12 prints.
This may seem like a lot of “extra” code, but one benefit of TryParse
is that you can provide specific feedback for your user.
Another benefit of TryParse
is that it doesn’t immediately shut down your program if the user input is non-numeric.
TryParse
in this example is used with a double, but can be used for all of the primitive data types, including ints.
Here’s a short practice repl.it using TryParse
and ints.