1

我发送 httpRequest 并在 try 块中获取 httpResponse。现在我真的不在乎我得到什么类型的异常,原因有几个。

try
     {
        var request = WebRequest.Create(new Uri("MyUrl")) as HttpWebRequest;
        request.GetResponse();
     }
catch(Exception)
    {
    }

FxCop 希望我给出特定的异常,所以在我的情况下,我需要创建几个 catch 块,如下所示:

NotSupportedException
ArgumentNullException
SecurityException
InvalidOperationException
ProtocolViolationException
NotSupportedException
WebException

我该如何解决这个警告并避免同时编写这么多的 catch 块?

4

4 回答 4

4

与在该主题上提出的另一个问题类似,如果您想捕获异常,您必须throw在处理程序中有一个 final 以防止出现警告。

从有关此警告的MSDN 文档中:

要修复违反此规则的行为,请捕获更具体的异常,或将一般异常重新抛出为 catch 块中的最后一条语句。

也就是说,这对您的情况并没有真正的帮助,因为您想“吞下”异常,而不是重新抛出它。看着这六个特定例外的列表,我无法想象花时间(认真地像五分钟)以 推荐的 方式处理每一个例外是一种痛苦的经历。这种情况并不经常发生,WebRequest 只是那些罕见的例子之一。

如果您的应用程序的生命周期很长,那么随着时间的推移,您可能会发现自己为这些异常中的每一个都实现了处理程序。没有人喜欢“发生一般错误 405”的错误消息。这可能不是 KISS,但奠定基础将使您避免捕获所有异常(如OutOfMemoryException),并且还可以防止 FxCop 警告(以及挑剔的开发人员的蔑视)。

如果您在应用程序中生成大量 WebRequest,那么下面的帮助程序类可能会很有用,它会抛出一个单一的WebFetcherException并且还有更多有用的错误消息。这是一个例子:

public static class WebFetcher
{
    public WebResponse FetchFromUrl(Uri uri)
    {
        try
        {
            var request = WebRequest.Create(new Uri("MyUrl")) as HttpWebRequest;
            return request.GetResponse();
        }
        catch (NotSupportedException ex)
        {
            //you could customize the error messages to be more suitable for your
            //application, or leaving room for future error handling
            throw new WebFetcherException(ex.Message, ex);
        }
        catch (ArgumentNullException ex)
        {
            throw new WebFetcherException(ex.Message, ex);
        }
        catch (SecurityException ex)
        {
            throw new WebFetcherException(ex.Message, ex);
        }
        catch (ProtocolViolationException ex)
        {
            throw new WebFetcherException(ex.Message, ex);
        }
        catch (WebException ex)
        {
            throw new WebFetcherException(ex.Message, ex);
        }
        catch (InvalidOperationException ex)
        {
            throw new WebFetcherException(ex.Message, ex);
        }
    }

    public class WebFetcherException : Exception
    {
        public WebFetcherException(string message, Exception inner)
            : base(message, inner)
        { }
    }
}
于 2012-04-13T20:21:15.263 回答
3

您可以停用多个警告,我总是停用此警告 :-)

于 2012-04-11T21:02:12.070 回答
2

fxCop 警告是建议,而不是命令。

换句话说,您可以自由判断是否遵循 fxCop 提出的指导方针和建议。

之所以有这个特别的建议,是因为您可能希望以不同的方式处理不同类型的错误。如果不是这种情况,您可以忽略此规则,这样它就不会弄乱您的警告列表。

您比 fxCop 更了解您的业务规则和编码标准。它只是根据可能适用于也可能不适用于您的特定情况的最佳实践提出建议。

更多信息可以在这里找到:http: //msdn.microsoft.com/en-us/library/bb429303 (VS.80).aspx

于 2012-04-11T21:04:02.793 回答
-1

尝试将其留空

try
{
        var request = WebRequest.Create(new Uri("http://localhost:59449/stwebapi/getstatus?userId=" + wwId)) as HttpWebRequest;
        request.GetResponse();
     }
catch
{

}

需要说这是非常糟糕的设计,所以最好遵循FxCop指导方针,或者至少处理一个异常,并记录它(至少)

于 2012-04-11T20:58:28.870 回答