【问题标题】:.NET throws WebException instead of setting StatusCode.NET 抛出 WebException 而不是设置 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 时会出现此异常?

我找到了有关如何处理异常并从中获取状态代码和描述的信息。但是我想知道为什么首先抛出异常,而不是设置响应对象的状态代码并让编码器决定它是否需要异常。

【问题讨论】:

    标签: c# ftp system.net.webexception


    【解决方案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 
      }
      

      【讨论】:

        猜你喜欢
        • 2017-06-04
        • 1970-01-01
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多