catch块的结果可以传递给try块内的方法吗?

时间:2012-07-18 11:40:51

标签: c# error-handling scope try-catch httpwebresponse

我的程序中有以下代码:

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

3 个答案:

答案 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,但答案可能是'不'