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

时间:2013-06-08 12:11:47

标签: 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());

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

  

“使用未分配的本地变量'reader'”

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

3 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:7)

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

如果您有异常,则抓住它,然后在其后运行代码。这就是你得到这个错误的原因。

你可以

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

答案 2 :(得分:2)

WebRequest myRequest = WebRequest.Create(baseUri.OriginalString);
    WebResponse myResponse = null;
    Stream myStream= null;
    StreamReader reader =null;

这将分配变量

编辑:

如果您这样做,您应该在try / catch

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

请注意在您的情况下最好将所有内容放入try / catch块