catch块的结果是否可以传递给try块内的方法



我的程序中有以下代码:

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,但答案可能是"否"

最新更新