[英]How to avoid 'Unassigned Local Variable' defined inside a try-catch block
这是我经常面临的一个错误。 虽然我设法通过某种方式绕过它,但它真的让我很恼火。 在下面的代码片段中,我想防止来自 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 块中。
您可以像@Svexo 建议的那样为它分配null
,但是如果流出错,这将引发异常。
编译器说use of unassigned variable
因为无论如何都会执行 try/catch 块之后的代码。
如果你有一个异常,你捕捉它,然后在它之后运行代码。 这就是您收到此错误的原因。
你可以
null
分配给局部变量,然后在执行其余代码之前测试它们是否为 null 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 块中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.