简体   繁体   中英

How to avoid 'Unassigned Local Variable' defined inside a try-catch block

This is one error that I regularly face. Although I manage to circumvent it using some way or another, it really annoys me. In the code snippet below, I want to safe guard against exceptions from myRequest.GetResponse()

        WebRequest myRequest = WebRequest.Create(baseUri.OriginalString);
        WebResponse myResponse;
        Stream myStream;
        StreamReader reader;
        try
        {
            myResponse = myRequest.GetResponse();
            myStream = myResponse.GetResponseStream();
            reader = new StreamReader(myStream);
        }
        catch (WebException status)
        {
            txtConsole.AppendText("Error in GetLinks::WebException\n" + status.Response);
            txtConsole.AppendText(Environment.NewLine);
        }
        catch
        {
            txtConsole.AppendText("Some error in GetLinks");
            txtConsole.AppendText(Environment.NewLine);
        }

        Regex regex = new Regex(@"\s*(?i)href\s*=\s*(\""([^""]*\"")|'[^']*'|([^'"">\s]+))", RegexOptions.IgnoreCase);
        MatchCollection splits = regex.Matches(reader.ReadToEnd());

Now, when I try to build/compile the code, it says

"Use of unassigned local variable 'reader'"

Now my question, if try statement runs smoothly without any exceptions being thrown, why can't the compiler access the value assigned to reader inside the try block?

You are using a variable, that is assigned in a try/catch block, outside that block. You'll want to move the whole code into the try block.

You could assign null to it like @Svexo proposed, but this will throw an exception should the stream error out.

The compiler says use of unassigned variable because the code after the try/catch block will be executed anyway.

If you have an exception, you catch it, then you run the code after it. That's why you get this error.

You can either

  • assign null to the local variables and then test if they're null before executing the rest of the code
  • return the function in your catch block.
  • or move all the code into the try block as suggested @Femaref
 WebRequest myRequest = WebRequest.Create(baseUri.OriginalString);
 WebResponse myResponse = null;
 Stream myStream= null;
 StreamReader reader =null;

This will assign the variables

Edit:

If you do it like this you should add an if outside your try/catch

if(reader != null)
{
        Regex regex = new Regex(@"\s*(?i)href\s*=\s*(\""([^""]*\"")|'[^']*'|([^'"">\s]+))", RegexOptions.IgnoreCase);
        MatchCollection splits = regex.Matches(reader.ReadToEnd());
}

Do note in your case its better to put everything in the try/catch block

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