How to re-ask for input in try catch statement












1















string l = Console.ReadLine();

try
{
int.Parse(l);
}
catch (FormatException)
{
Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
}


As you can see, I have asked for input, but if the user enters a non-integral answer such as the letter "f", the catch statement catches it, but then throws the exception again afterwards, because the variable "l" still equals "f". Help?










share|improve this question




















  • 5





    Seems you should learn what a loop is before you start using try catch.

    – ChaosPandion
    May 15 '13 at 20:42
















1















string l = Console.ReadLine();

try
{
int.Parse(l);
}
catch (FormatException)
{
Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
}


As you can see, I have asked for input, but if the user enters a non-integral answer such as the letter "f", the catch statement catches it, but then throws the exception again afterwards, because the variable "l" still equals "f". Help?










share|improve this question




















  • 5





    Seems you should learn what a loop is before you start using try catch.

    – ChaosPandion
    May 15 '13 at 20:42














1












1








1








string l = Console.ReadLine();

try
{
int.Parse(l);
}
catch (FormatException)
{
Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
}


As you can see, I have asked for input, but if the user enters a non-integral answer such as the letter "f", the catch statement catches it, but then throws the exception again afterwards, because the variable "l" still equals "f". Help?










share|improve this question
















string l = Console.ReadLine();

try
{
int.Parse(l);
}
catch (FormatException)
{
Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
}


As you can see, I have asked for input, but if the user enters a non-integral answer such as the letter "f", the catch statement catches it, but then throws the exception again afterwards, because the variable "l" still equals "f". Help?







c#






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited May 15 '13 at 20:42









Sean Bright

93.6k14114128




93.6k14114128










asked May 15 '13 at 20:39









omniomni

4421516




4421516








  • 5





    Seems you should learn what a loop is before you start using try catch.

    – ChaosPandion
    May 15 '13 at 20:42














  • 5





    Seems you should learn what a loop is before you start using try catch.

    – ChaosPandion
    May 15 '13 at 20:42








5




5





Seems you should learn what a loop is before you start using try catch.

– ChaosPandion
May 15 '13 at 20:42





Seems you should learn what a loop is before you start using try catch.

– ChaosPandion
May 15 '13 at 20:42












4 Answers
4






active

oldest

votes


















5














You can use int.TryParse instead of catching exceptions. It returns whether the parse was successful, so you can check it in a loop until the input is valid e.g.



int i;
bool valid = false;
do {
Console.WriteLine("Enter an int: ");
string input = Console.ReadLine();
valid = int.TryParse(input, out i);
} while(! valid);

//use i





share|improve this answer
























  • There's no need to declare an additional bool field for this if you embed the TryCatch in the condition of the loop.

    – qJake
    May 15 '13 at 20:46



















3














You'll want to use TryParse with a while loop (since your condition can fail an infinite number of times).



string l = Console.ReadLine();

int line = 0;

while(!int.TryParse(l, out line))
{
Console.WriteLine("Try again.");
l = Console.ReadLine();
}

// line contains a valid number here.





share|improve this answer

































    2














    don't do it that way. Use TryParse instead



            string l = Console.ReadLine();

    int i;

    while(int.TryParse(l, out i) == false)
    {
    Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
    l = Console.ReadLine();
    }





    share|improve this answer
























    • == false? Why not !?

      – qJake
      May 15 '13 at 20:43











    • @SpikeX - Its so you know it is a boolean!!!!

      – ChaosPandion
      May 15 '13 at 20:44











    • @SpikeX I personally think that !int.TryParse(l, out i) looks too similar to int.TryParse(l, out i) It improves readability for me

      – Sam I am
      May 15 '13 at 20:44











    • @ChaosPandion Your IDE should be responsible for relaying type information, not your code.

      – qJake
      May 15 '13 at 20:44













    • @SpikeX - I was being snarky.

      – ChaosPandion
      May 15 '13 at 20:46



















    0














    There are various ways you can handle this. One way it to wrap all of this in a loop allowing a given number of retries or just a while loop that keeps going until the user enters valid input. Another is to put it all in a method and call it recursively from the catch block. I think the best solution is neither, instead I would use Int.TryParse and I would have that inside a while loop like;



     while (!Int32.TryParse(input, out line))
    {
    Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
    input = Console.ReadLine();
    }





    share|improve this answer

























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f16574556%2fhow-to-re-ask-for-input-in-try-catch-statement%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      4 Answers
      4






      active

      oldest

      votes








      4 Answers
      4






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      5














      You can use int.TryParse instead of catching exceptions. It returns whether the parse was successful, so you can check it in a loop until the input is valid e.g.



      int i;
      bool valid = false;
      do {
      Console.WriteLine("Enter an int: ");
      string input = Console.ReadLine();
      valid = int.TryParse(input, out i);
      } while(! valid);

      //use i





      share|improve this answer
























      • There's no need to declare an additional bool field for this if you embed the TryCatch in the condition of the loop.

        – qJake
        May 15 '13 at 20:46
















      5














      You can use int.TryParse instead of catching exceptions. It returns whether the parse was successful, so you can check it in a loop until the input is valid e.g.



      int i;
      bool valid = false;
      do {
      Console.WriteLine("Enter an int: ");
      string input = Console.ReadLine();
      valid = int.TryParse(input, out i);
      } while(! valid);

      //use i





      share|improve this answer
























      • There's no need to declare an additional bool field for this if you embed the TryCatch in the condition of the loop.

        – qJake
        May 15 '13 at 20:46














      5












      5








      5







      You can use int.TryParse instead of catching exceptions. It returns whether the parse was successful, so you can check it in a loop until the input is valid e.g.



      int i;
      bool valid = false;
      do {
      Console.WriteLine("Enter an int: ");
      string input = Console.ReadLine();
      valid = int.TryParse(input, out i);
      } while(! valid);

      //use i





      share|improve this answer













      You can use int.TryParse instead of catching exceptions. It returns whether the parse was successful, so you can check it in a loop until the input is valid e.g.



      int i;
      bool valid = false;
      do {
      Console.WriteLine("Enter an int: ");
      string input = Console.ReadLine();
      valid = int.TryParse(input, out i);
      } while(! valid);

      //use i






      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered May 15 '13 at 20:42









      LeeLee

      120k14177248




      120k14177248













      • There's no need to declare an additional bool field for this if you embed the TryCatch in the condition of the loop.

        – qJake
        May 15 '13 at 20:46



















      • There's no need to declare an additional bool field for this if you embed the TryCatch in the condition of the loop.

        – qJake
        May 15 '13 at 20:46

















      There's no need to declare an additional bool field for this if you embed the TryCatch in the condition of the loop.

      – qJake
      May 15 '13 at 20:46





      There's no need to declare an additional bool field for this if you embed the TryCatch in the condition of the loop.

      – qJake
      May 15 '13 at 20:46













      3














      You'll want to use TryParse with a while loop (since your condition can fail an infinite number of times).



      string l = Console.ReadLine();

      int line = 0;

      while(!int.TryParse(l, out line))
      {
      Console.WriteLine("Try again.");
      l = Console.ReadLine();
      }

      // line contains a valid number here.





      share|improve this answer






























        3














        You'll want to use TryParse with a while loop (since your condition can fail an infinite number of times).



        string l = Console.ReadLine();

        int line = 0;

        while(!int.TryParse(l, out line))
        {
        Console.WriteLine("Try again.");
        l = Console.ReadLine();
        }

        // line contains a valid number here.





        share|improve this answer




























          3












          3








          3







          You'll want to use TryParse with a while loop (since your condition can fail an infinite number of times).



          string l = Console.ReadLine();

          int line = 0;

          while(!int.TryParse(l, out line))
          {
          Console.WriteLine("Try again.");
          l = Console.ReadLine();
          }

          // line contains a valid number here.





          share|improve this answer















          You'll want to use TryParse with a while loop (since your condition can fail an infinite number of times).



          string l = Console.ReadLine();

          int line = 0;

          while(!int.TryParse(l, out line))
          {
          Console.WriteLine("Try again.");
          l = Console.ReadLine();
          }

          // line contains a valid number here.






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited May 15 '13 at 20:48

























          answered May 15 '13 at 20:43









          qJakeqJake

          12.1k1064114




          12.1k1064114























              2














              don't do it that way. Use TryParse instead



                      string l = Console.ReadLine();

              int i;

              while(int.TryParse(l, out i) == false)
              {
              Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
              l = Console.ReadLine();
              }





              share|improve this answer
























              • == false? Why not !?

                – qJake
                May 15 '13 at 20:43











              • @SpikeX - Its so you know it is a boolean!!!!

                – ChaosPandion
                May 15 '13 at 20:44











              • @SpikeX I personally think that !int.TryParse(l, out i) looks too similar to int.TryParse(l, out i) It improves readability for me

                – Sam I am
                May 15 '13 at 20:44











              • @ChaosPandion Your IDE should be responsible for relaying type information, not your code.

                – qJake
                May 15 '13 at 20:44













              • @SpikeX - I was being snarky.

                – ChaosPandion
                May 15 '13 at 20:46
















              2














              don't do it that way. Use TryParse instead



                      string l = Console.ReadLine();

              int i;

              while(int.TryParse(l, out i) == false)
              {
              Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
              l = Console.ReadLine();
              }





              share|improve this answer
























              • == false? Why not !?

                – qJake
                May 15 '13 at 20:43











              • @SpikeX - Its so you know it is a boolean!!!!

                – ChaosPandion
                May 15 '13 at 20:44











              • @SpikeX I personally think that !int.TryParse(l, out i) looks too similar to int.TryParse(l, out i) It improves readability for me

                – Sam I am
                May 15 '13 at 20:44











              • @ChaosPandion Your IDE should be responsible for relaying type information, not your code.

                – qJake
                May 15 '13 at 20:44













              • @SpikeX - I was being snarky.

                – ChaosPandion
                May 15 '13 at 20:46














              2












              2








              2







              don't do it that way. Use TryParse instead



                      string l = Console.ReadLine();

              int i;

              while(int.TryParse(l, out i) == false)
              {
              Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
              l = Console.ReadLine();
              }





              share|improve this answer













              don't do it that way. Use TryParse instead



                      string l = Console.ReadLine();

              int i;

              while(int.TryParse(l, out i) == false)
              {
              Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
              l = Console.ReadLine();
              }






              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered May 15 '13 at 20:41









              Sam I amSam I am

              27k115995




              27k115995













              • == false? Why not !?

                – qJake
                May 15 '13 at 20:43











              • @SpikeX - Its so you know it is a boolean!!!!

                – ChaosPandion
                May 15 '13 at 20:44











              • @SpikeX I personally think that !int.TryParse(l, out i) looks too similar to int.TryParse(l, out i) It improves readability for me

                – Sam I am
                May 15 '13 at 20:44











              • @ChaosPandion Your IDE should be responsible for relaying type information, not your code.

                – qJake
                May 15 '13 at 20:44













              • @SpikeX - I was being snarky.

                – ChaosPandion
                May 15 '13 at 20:46



















              • == false? Why not !?

                – qJake
                May 15 '13 at 20:43











              • @SpikeX - Its so you know it is a boolean!!!!

                – ChaosPandion
                May 15 '13 at 20:44











              • @SpikeX I personally think that !int.TryParse(l, out i) looks too similar to int.TryParse(l, out i) It improves readability for me

                – Sam I am
                May 15 '13 at 20:44











              • @ChaosPandion Your IDE should be responsible for relaying type information, not your code.

                – qJake
                May 15 '13 at 20:44













              • @SpikeX - I was being snarky.

                – ChaosPandion
                May 15 '13 at 20:46

















              == false? Why not !?

              – qJake
              May 15 '13 at 20:43





              == false? Why not !?

              – qJake
              May 15 '13 at 20:43













              @SpikeX - Its so you know it is a boolean!!!!

              – ChaosPandion
              May 15 '13 at 20:44





              @SpikeX - Its so you know it is a boolean!!!!

              – ChaosPandion
              May 15 '13 at 20:44













              @SpikeX I personally think that !int.TryParse(l, out i) looks too similar to int.TryParse(l, out i) It improves readability for me

              – Sam I am
              May 15 '13 at 20:44





              @SpikeX I personally think that !int.TryParse(l, out i) looks too similar to int.TryParse(l, out i) It improves readability for me

              – Sam I am
              May 15 '13 at 20:44













              @ChaosPandion Your IDE should be responsible for relaying type information, not your code.

              – qJake
              May 15 '13 at 20:44







              @ChaosPandion Your IDE should be responsible for relaying type information, not your code.

              – qJake
              May 15 '13 at 20:44















              @SpikeX - I was being snarky.

              – ChaosPandion
              May 15 '13 at 20:46





              @SpikeX - I was being snarky.

              – ChaosPandion
              May 15 '13 at 20:46











              0














              There are various ways you can handle this. One way it to wrap all of this in a loop allowing a given number of retries or just a while loop that keeps going until the user enters valid input. Another is to put it all in a method and call it recursively from the catch block. I think the best solution is neither, instead I would use Int.TryParse and I would have that inside a while loop like;



               while (!Int32.TryParse(input, out line))
              {
              Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
              input = Console.ReadLine();
              }





              share|improve this answer






























                0














                There are various ways you can handle this. One way it to wrap all of this in a loop allowing a given number of retries or just a while loop that keeps going until the user enters valid input. Another is to put it all in a method and call it recursively from the catch block. I think the best solution is neither, instead I would use Int.TryParse and I would have that inside a while loop like;



                 while (!Int32.TryParse(input, out line))
                {
                Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
                input = Console.ReadLine();
                }





                share|improve this answer




























                  0












                  0








                  0







                  There are various ways you can handle this. One way it to wrap all of this in a loop allowing a given number of retries or just a while loop that keeps going until the user enters valid input. Another is to put it all in a method and call it recursively from the catch block. I think the best solution is neither, instead I would use Int.TryParse and I would have that inside a while loop like;



                   while (!Int32.TryParse(input, out line))
                  {
                  Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
                  input = Console.ReadLine();
                  }





                  share|improve this answer















                  There are various ways you can handle this. One way it to wrap all of this in a loop allowing a given number of retries or just a while loop that keeps going until the user enters valid input. Another is to put it all in a method and call it recursively from the catch block. I think the best solution is neither, instead I would use Int.TryParse and I would have that inside a while loop like;



                   while (!Int32.TryParse(input, out line))
                  {
                  Console.WriteLine("Invalid input. Please enter 1, 2, or 3.");
                  input = Console.ReadLine();
                  }






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 21 '18 at 12:33









                  Dmitry Bychenko

                  111k1098140




                  111k1098140










                  answered May 15 '13 at 20:43









                  evanmcdonnalevanmcdonnal

                  28.7k115681




                  28.7k115681






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f16574556%2fhow-to-re-ask-for-input-in-try-catch-statement%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Guess what letter conforming each word

                      Port of Spain

                      Run scheduled task as local user group (not BUILTIN)