当我捕获一个 .NET 时WebException
,我应该关闭/处置它Response.GetResponseStream()
吗?
MSDN 示例不会关闭或处理异常中的任何内容。
我处理了流,这引起了大问题。因为GetResponseStream()
(总是?/有时?)返回相同的实例。因此,当我获取响应流然后将其释放时,可能会将异常重新引发到另一个也获取响应流的层,它将已被释放且不可读,并因此引发更多异常。
当我捕获一个 .NET 时WebException
,我应该关闭/处置它Response.GetResponseStream()
吗?
MSDN 示例不会关闭或处理异常中的任何内容。
我处理了流,这引起了大问题。因为GetResponseStream()
(总是?/有时?)返回相同的实例。因此,当我获取响应流然后将其释放时,可能会将异常重新引发到另一个也获取响应流的层,它将已被释放且不可读,并因此引发更多异常。
一个简短的回答是您不必处置它,尽管处置IDisposable
您拥有的任何对象是一个很好的练习。
事实上,尝试处理WebException.Response
或从它返回的流会导致您提到的问题,因为您可能会遇到尝试在上层调用链的异常处理程序中读取其属性的代码。
不处置它是安全的原因是因为HttpWebRequest
内部在它 throws 之前从网络流中生成了一个内存流WebException
,并且底层网络流已经被关闭/处置。因此,此时它实际上并没有任何关联的非托管资源。我认为这是一个更容易处理异常的决定。
不幸的是,MSDN 文档对此行为没有任何解释。从技术上讲,实现可能会在未来发生变化,从而导致您的代码无法处理HttpWebResponse
您从中获得的和/或相关流的问题WebException
,但是鉴于许多应用程序依赖于当前行为,这种行为不太可能改变实现。
我必须补充一点,你应该处理IDisposable
你拥有的对象是一个很好的做法。如果可能,请改用HttpClient
class,这样您就不必处理这种情况了。如果不能,请考虑处理WebException
自己并抛出不会暴露WebException
给代码调用者的新类型异常,这样您就不会遇到调用者WebException.Response
在处理后尝试访问的情况。
免责声明:我为 Microsoft 工作,但这并不代表我的雇主或 .NET Framework 团队的观点。不暗示任何保证。
You should dispose of that stream because it might hold resources. But only dispose of it when you are done with it. Simply stop disposing it before you no longer need the stream. Make the last user of the stream dispose of it.
Probably, you should call GetResponseStream()
only once and pass the stream around explicitly so that it is clear that it's the same stream.