我的程序中有以下代码:
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
if (response == null)
return false;
aDoc.Load(response.GetResponseStream()); //Load the response into another object
}
catch (WebException e)
{
//404's are caught and are saved as the response.
//The reason being that 404's from this particular
// website still provide relevant information that needs
// extracting.
response = (HttpWebResponse)e.Response;
}
finally
{
response.Close();
}
我的问题是:如果捕获了WebException,是否会将response = (HttpWebResponse)e.Response;
的响应传递给aDoc.Load()
方法?
顺便说一句,在将更多内容移入try-catch块之前,我有以下代码。我认为添加finally
Close()
会更安全,但我仍然想知道我是否应该首先改变任何内容。
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
response = (HttpWebResponse)e.Response;
}
if (response == null)
return false;
aDoc.Load(response.GetResponseStream());
response.Close();
答案 0 :(得分:1)
没有。您需要像在第二个示例中那样隔离正确的代码块。
你当然可以窝:
HttpWebResponse response = null;
try {
try {
response = (HttpWebResponse)request.GetResponse();
} catch (WebException e) {
response = (HttpWebResponse)e.Response;
}
if (response == null) return false;
aDoc.Load(response.GetResponseStream());
} finally {
if (response != null) response.Close();
}
答案 1 :(得分:1)
不,
如果抛出了WebException
,它就会离开try
块,try
块中不再执行任何代码,只会执行finally
中的代码块。
答案 2 :(得分:1)
答案是肯定而且不是 - 因为将响应传递给aDoc.Load()
的代码是最后一个语句,异常只能在该行上或之上发生。
假设aDoc.Load()
从不抛出WebException,那么答案就是
如果aDoc.Load()
抛出WebException,那么异常可能来自该方法 - 因此技术上aDoc.Load()
可能已经从GetResponse()
方法传递了结果,并且异常可能被抛出{ {1}} - 取决于aDoc.Load()
实施,但
异常会停止代码执行,因此一旦抛出异常,下一段要执行的代码就是aDoc.Load()
块中的代码(如果没有代码,则在堆栈中的任何catch块)现在)然后运行catch
我的假设是aDoc.Load()不是任何类型的Web方法(也许是你自己的类)所以你应该最好地了解是否抛出WebException,但答案可能是'不'