在异常中正确处理HttpWebResponse

时间:2017-10-09 22:26:43

标签: c#

考虑从Microsoft doc获取以下函数:

void webREquest(url) {
  // taken from https://msdn.microsoft.com/en-us/library/system.net.webexception.response(v=vs.110).aspx
  try {
     // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
     HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create(url);

    // Get the associated response for the above request.
    HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
    myHttpWebResponse.Close();
  }
  catch(WebException e) {
    Console.WriteLine("This program is expected to throw WebException on successful run."+
              "\n\nException Message :" + e.Message);
    if(e.Status == WebExceptionStatus.ProtocolError) {
      Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
      Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
    }
  }
  catch(Exception e) {
    Console.WriteLine(e.Message);
  }
}

关于对象处理或不适的方式,我有几个问题:

  • myHttpWebRequest没有直接关闭/处理 - 这真的没必要吗?在这种情况下请求何时关闭?我怎样才能确保它尽快关闭?

  • {li>

    WebException catch块中,是否有必要以某种方式处置/关闭e.Response(类型为HttpWebResponse)?如果不是在何处/如何处置?

  • usingmyHttpWebRequest附近设置myHttpWebResponse条款会不会更好?但如果是这样,是否会使异常处理程序中的e.Response无法访问?

  • &#34的含义是什么;该程序预计会在成功运行时抛出WebException"上面?

我需要确保在函数退出后绝对没有连接...

1 个答案:

答案 0 :(得分:1)

  

myHttpWebRequest没有直接关闭/处理 - 这是真的   不必要?在这种情况下请求何时关闭?我该怎么做   确定它尽快关闭了吗?

是的,但考虑到该类没有实现IDisposable接口,看起来似乎没有。

  WebException catch块中的

是不是必须以某种方式   dispose / close e.Response(属于HttpWebResponse类型)?如果不   在哪里/如何处置?

我建议在finally块中关闭它以处理异常和非预期场景

  

在myHttpWebRequest周围使用using子句会不会更好   和myHttpWebResponse?但如果是这样的话,那会让e.Response成为了   异常处理程序无法访问?

不幸的是,HttpWebRequest没有实现IDisposable,所以你不能在这种情况下使用

  

&#34的含义是什么;该程序有望抛出   WebException成功运行"以上?

评论中提到,请求是对无效网站提出的,因此应该抛出异常

void webREquest(string url)
        {
            // taken from https://msdn.microsoft.com/en-us/library/system.net.webexception.response(v=vs.110).aspx
            HttpWebRequest myHttpWebRequest = null;
            HttpWebResponse myHttpWebResponse = null;
            try
            {
                // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
                myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);

                // Get the associated response for the above request.
                myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                myHttpWebResponse.Close();
            }
            catch (WebException e)
            {
                Console.WriteLine("This program is expected to throw WebException on successful run." +
                          "\n\nException Message :" + e.Message);
                if (e.Status == WebExceptionStatus.ProtocolError)
                {
                    Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
                    Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                //close on myHttpWebResponse
                myHttpWebResponse?.Close();

                //mark myHttpWebRequest for collection
                myHttpWebRequest = null;
            }
        }