考虑从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
没有直接关闭/处理 - 这真的没必要吗?在这种情况下请求何时关闭?我怎样才能确保它尽快关闭?
在WebException
catch块中,是否有必要以某种方式处置/关闭e.Response
(类型为HttpWebResponse
)?如果不是在何处/如何处置?
在using
和myHttpWebRequest
附近设置myHttpWebResponse
条款会不会更好?但如果是这样,是否会使异常处理程序中的e.Response
无法访问?
&#34的含义是什么;该程序预计会在成功运行时抛出WebException"上面?
我需要确保在函数退出后绝对没有连接...
答案 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;
}
}