.NET 抛出 WebException 而不是设置 StatusCode
Posted
技术标签:
【中文标题】.NET 抛出 WebException 而不是设置 StatusCode【英文标题】:.NET throws WebException instead of setting StatusCode 【发布时间】:2013-11-20 22:38:11 【问题描述】:我的方法中有以下代码:
// make the FTP request
var request = (FtpWebRequest)WebRequest.Create(serverUri);
request.KeepAlive = true;
request.Method = WebRequestMethods.Ftp.MakeDirectory;
return (FtpWebResponse)request.GetResponse();
serverUri 是有效的,如果该目录在服务器上不存在,则此方法有效。但是,如果该目录已存在,则会出现 System.Net.WebException : The remote server returned an error: (550) File unavailable (e.g., file not found, no access)
。
为什么当我调用request.GetResponse()
而不是将FtpWebResponse 对象的StatusCode 设置为FtpStatusCode.ActionNotTakenFileUnavailable
即550 时会出现此异常?
我找到了有关如何处理异常并从中获取状态代码和描述的信息。但是我想知道为什么首先抛出异常,而不是设置响应对象的状态代码并让编码器决定它是否需要异常。
【问题讨论】:
【参考方案1】:因为在发出 Http 请求后得到的错误代码与语言的 Exception 语义完全匹配。您实际上没有有意义的响应来返回,因为这是一个“异常”情况,所以将 Web 错误转换为 WebException 是有意义的。
【讨论】:
【参考方案2】:这实际上是按设计运行的。您需要捕获该特定异常,然后询问响应。根据MSDN documentation:
如果引发 WebException,请使用异常的 Response 和 Status 属性来确定来自服务器的响应。
因此,代码可能如下所示:
try
return (FtpWebResponse)request.GetResponse();
catch (WebException we)
// interrogate the WebException for the response data you're looking for
【讨论】:
以上是关于.NET 抛出 WebException 而不是设置 StatusCode的主要内容,如果未能解决你的问题,请参考以下文章
使用 HtmlAgilityPack 进行 Web 查询抛出 System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道 [重复]
读取 WebException 的响应流时出现 WebException
HttpWebRequest .GetResponse 抛出 WebException '操作已超时'