与在该主题上提出的另一个问题类似,如果您想捕获异常,您必须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)
{ }
}
}