这是我经常遇到的一个错误。虽然我设法以某种方式规避它,但它真的让我烦恼。 在下面的代码片段中,我想要安全地防范来自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的值?
答案 0 :(得分:10)
您正在使用在该块之外的try / catch块中分配的变量。您需要将整个代码移动到try块中。
你可以像@Svexo建议的那样为它分配null
,但如果流出错,这将抛出异常。
答案 1 :(得分:7)
编译器说use of unassigned variable
因为无论如何都会执行try / catch块之后的代码。
如果您有异常,则抓住它,然后在其后运行代码。这就是你得到这个错误的原因。
你可以
null
分配给局部变量,然后在执行其余代码之前测试它们是否为空答案 2 :(得分:2)
WebRequest myRequest = WebRequest.Create(baseUri.OriginalString); WebResponse myResponse = null; Stream myStream= null; StreamReader reader =null;
这将分配变量
编辑:
如果您这样做,您应该在try / catch
之外添加一个ifif(reader != null)
{
Regex regex = new Regex(@"\s*(?i)href\s*=\s*(\""([^""]*\"")|'[^']*'|([^'"">\s]+))", RegexOptions.IgnoreCase);
MatchCollection splits = regex.Matches(reader.ReadToEnd());
}
请注意在您的情况下最好将所有内容放入try / catch块