gpt4 book ai didi

c# - WebException.Response.GetResponseStream() 应该关闭/处置吗?

转载 作者:太空狗 更新时间:2023-10-29 20:13:10 33 4
gpt4 key购买 nike

当我捕捉到 .NET WebException 时,我应该关闭/处置 Response.GetResponseStream() 吗?

MSDN example不会关闭或处理异常中的任何内容。

很多SO answers建议处理响应和/或流。

我处理了流,这导致了大问题。因为 GetResponseStream()(总是?/有时?)返回相同的实例。因此,当我获取响应流然后处理它时,可能会将异常重新抛出到另一个也获取响应流的层,它将已经被处理并且不可读,并因此抛出更多异常。

最佳答案

简短的回答是您不必处置它,尽管处置您拥有的任何 IDisposable 对象是一个很好的练习。

事实上,尝试处置 WebException.Response 或从它返回的流会导致您提到的问题,因为您可能会遇到代码试图在上层调用链的异常处理程序中读取其属性。

之所以不处理它是安全的,是因为HttpWebRequest在抛出WebException之前,在内部从网络流中创建了一个内存流,底层网络流有已经关闭/处置。因此,此时它实际上并没有关联任何非托管资源。我认为这是为了更容易处理异常而做出的决定。

遗憾的是,MSDN 文档对此行为没有任何解释。从技术上讲,实现可能会在未来发生变化,导致您的代码出现问题,而不是处理 HttpWebResponse 和/或您从 WebException 获得的相关流,但这种行为改变的可能性很小许多应用程序的实现取决于当前行为。

我必须补充一点,尽管处置您拥有的 IDisposable 对象是一种很好的做法。如果可能,请使用 HttpClient class 而不是这样你就不必处理这种情况了。如果不能,请考虑自己处理 WebException 并抛出不会将 WebException 暴露给代码调用者的新型异常,这样您就不会遇到调用者在处理后尝试访问 WebException.Response 的情况。

免责声明:我在 Microsoft 工作,但这并不代表我的雇主或 .NET Framework 团队的观点。没有暗示保证。

关于c# - WebException.Response.GetResponseStream() 应该关闭/处置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32891627/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com