0

我的程序中有以下代码:

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 块之前,我有以下代码。我认为添加finallywithClose()会更安全,但我仍然想知道我是否应该首先更改任何内容。

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();
4

3 回答 3

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();
}
于 2012-07-18T11:43:42.210 回答
1

不,

如果 aWebException被抛出,它已经离开了try块,块中的代码try不会被执行,只会执行块中的代码finally

于 2012-07-18T11:43:43.930 回答
1

答案是肯定的和否定的——因为传递响应的代码aDoc.Load()是最后一条语句,所以异常只能发生在该行之上或之上。

假设aDoc.Load()从不抛出 WebException,那么答案是否定的

如果aDoc.Load()抛出 WebException 则异常可能来自该方法-因此从技术上讲,aDoc.Load()可能已从该方法传递了结果,GetResponse()并且异常可能已在内部抛出-尽管aDoc.Load()取决于实现aDoc.Load()

异常会停止代码执行,因此一旦抛出异常,下一段要执行的代码就是块中的代码catch(或者如果不存在,则在堆栈中进一步向上的任何 catch 块)然后finally运行

我的假设是 aDoc.Load() 不是任何类型的 Web 方法(并且可能是您自己的类),因此您最好了解这是否会引发 WebException,但答案可能是“不”

于 2012-07-18T11:44:09.273 回答