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

本文关键字:try-catch 定义 分配 何避免 局部变量 | 更新日期: 2023-09-27 18:17:44

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

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

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

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

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

如果你有一个异常,你捕获它,然后在它之后运行代码。这就是为什么你会得到这个错误。

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