我有一个客户端类,它通过WebRequest
连接到服务器。现在我正在努力学习如何最好地实现WebException
处理。为了获得良好的UI反馈,我只需要(到目前为止)异常消息和状态。
我提出了三种不同的方法。第一个只是重新抛出异常,我在调用方法中进行处理。这可能是最通用的解决方案:
public class ClientSimpleRethrow
{
public bool IsConnected { get; set; }
public void Connect()
{
try
{
// do connection
}
catch (WebException)
{
IsConnected = false;
throw;
}
IsConnected = true;
}
}
第二个版本抛出一个自定义异常,WebException
为内部异常。这给了我的好处,就是只捕捉和处理我期望的东西。例如,可能还有另一个错误,它也会抛出WebException
我想要区别对待的错误。到目前为止,这是我最喜欢的解决方案:
public class ClientThrowCustom
{
public bool IsConnected { get; set; }
public void Connect()
{
try
{
// do connection
}
catch (WebException ex)
{
IsConnected = false;
throw new ClientConnectionException(ex.Message, ex);
}
IsConnected = true;
}
}
我还可以考虑第三种可能性。捕获异常并且我只设置了我真正需要在UI中处理异常的属性。我已经通过IsConnected
属性出错的信息。这种解决方案确实具有不会捕获两次的好处。
public class ClientProperties
{
public bool IsConnected { get; set; }
public string ConnectionErrorMessage { get; set; }
public WebExceptionStatus? ConnectionErrorStatus { get; set; }
public void Connect()
{
try
{
// do connection
}
catch (WebException ex)
{
IsConnected = false;
ConnectionErrorMessage = ex.Message;
ConnectionErrorStatus = ex.Status;
return;
}
IsConnected = true;
ConnectionErrorMessage = null;
ConnectionErrorStatus = null;
}
}
我需要一些我应该选择的最佳实践建议以及原因。我希望这个问题不是太主观,因为我真的认为,为什么选择一种设计而不是其他设计应该有一些确凿的事实。
提前感谢您的帮助!
答案 0 :(得分:2)
首先,我认为第三种方法很糟糕。关于异常的好处是它们不会强制调用上下文在继续之前检查错误代码。在try块中,您可以编写代码,就像每个函数都成功一样。第三种方法消除了这种精确性,使调用代码看起来更复杂。
至于前两个,我更喜欢第二个。它在我眼中有两个好处:
您可以创建一个Exception类,它在应用程序的上下文中表示某些内容,而不是在底层API的上下文中工作。 WebException
适用于API,但如果您在尝试登录某个系统时在方法中获取它,则LogInException
在应用程序的上层更有用。
自定义例外允许您从基础MyApplicationException
类开始并从那里开始构建。从那里,您可以捕获API异常并尽快将它们转换为MyApplicationException
子异常。这种方式当API异常波动到您的应用程序时,您立即知道存在一些您未考虑并需要解决的极端情况。未被捕获的应用程序异常只是意味着您没有正确使用自己的代码。