如何避免在try-catch块中定义的"未分配的局部变量"

SLe*_*ner 8 c# exception-handling try-catch

这是我经常遇到的一个错误.虽然我设法以某种方式规避它,但它真的让我烦恼.在下面的代码片段中,我想要安全防范来自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());
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试构建/编译代码时,它说

"使用未分配的局部变量'读者'"

现在我的问题是,如果try语句运行顺利而没有抛出任何异常,为什么编译器不能访问try块内分配给reader的值?

Fem*_*ref 11

您正在使用在该块之外的try/catch块中分配的变量.您需要将整个代码移动到try块中.

您可以null像@Svexo建议的那样分配给它,但如果流出错,这将抛出异常.

  • 在try块之后你对`reader`的使用揭示了一个依赖:你的代码取决于try块的正确返回.根据定义,这应该包含在try块中.当它变得无法管理时,你将不得不使用`null`然后希望你总是检查null. (2认同)

ppe*_*rov 7

编译器说use of unassigned variable因为无论如何都会执行try/catch块之后的代码.

如果你有一个例外,你抓住它,然后你运行代码.这就是你得到这个错误的原因.

你也可以

  • 分配null给局部变量,然后在执行其余代码之前测试它们是否为空
  • 返回catch块中的函数.
  • 或者按照@Femaref的建议将所有代码移动到try块中