11

这是我经常面临的一个错误。虽然我设法用某种方式绕过它,但它真的让我很恼火。在下面的代码片段中,我想防止来自 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 的值?

4

3 回答 3

12

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

您可以null像@Svexo 建议的那样分配给它,但是如果流错误输出,这将引发异常。

于 2013-06-08T12:14:26.733 回答
8

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

如果你有一个异常,你捕获它,然后在它之后运行代码。这就是您收到此错误的原因。

你可以

  • 分配null给局部变量,然后在执行其余代码之前测试它们是否为空
  • 在你的 catch 块中返回函数。
  • 或按照@Femaref 的建议将所有代码移到 try 块中
于 2013-06-08T12:17:41.903 回答
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 块中

于 2013-06-08T12:14:15.630 回答