如何优雅地处理fxCop警告“捕获特定的异常而不是类型System.Exception”?

时间:2012-04-11 20:57:49

标签: c# exception try-catch

我发送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

如何处理此警告并避免同时编写这些警告?

4 个答案:

答案 0 :(得分:4)

与此主题中提到的another question类似,如果要捕获异常,则必须在处理程序中设置最终throw,以防止出现警告。

来自此警告的MSDN documentation

  

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

那就是说,这对你的情况没有多大帮助,因为你想“吞下”异常,而不是重新抛出异常。看看这个六个特定例外的列表,我无法想象花时间(严重像五分钟)来处理most中的每一个都是一个痛苦的经历。 recommended way可能。这不是经常发生的事情,而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)
        { }
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

fxCop警告是建议,而不是强制要求。

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

这个特别的建议就在那里,因为你可能想要以不同的方式处理不同类型的错误。如果情况并非如此,您可以ignore this rule,这样就不会使您的警告列表混乱。

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

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

答案 3 :(得分:-1)

试着把它留空

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

}

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