我的程序中有以下代码:
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块之前,我有以下代码。我认为用Close()
添加finally
会更安全,但我仍然想知道我是否应该首先更改任何内容。
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();
否。您将需要隔离正确的代码块,就像您在第二个示例中所做的那样。
你当然可以嵌套:
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();
}
否,
如果抛出了WebException
,则它已离开try
块,并且不会执行try
块中的其他代码,只执行finally
块中的代码。
答案是yes和no-由于将响应传递给aDoc.Load()
的代码是最后一条语句,因此异常只能发生在该行或该行上方。
假设aDoc.Load()
从未抛出WebException,那么答案是没有
如果aDoc.Load()
抛出WebException,那么异常可能来自该方法——因此从技术上讲,aDoc.Load()
可能已经从GetResponse()
方法传递了结果,并且异常可能已经在aDoc.Load()
内部抛出——这取决于通过实现的aDoc.Load()
异常会停止代码执行,因此一旦抛出异常,下一段要执行的代码就是catch
块中的代码(如果没有,则是堆栈中的任何catch块),然后finally
运行
我的假设是aDoc.Load()不是任何类型的web方法(可能是你自己的类),所以你应该最好地了解它是否会引发WebException,但答案可能是"否"