C# 我应该为客户端连接选择哪个异常处理
我有一个客户端类,它通过C# 我应该为客户端连接选择哪个异常处理,c#,.net,exception-handling,C#,.net,Exception Handling,我有一个客户端类,它通过WebRequest连接到服务器。现在我正在努力解决如何最好地实现WebException处理。要获得良好的UI反馈,我只需要(到目前为止)异常消息和状态 我想出了三种不同的方法。第一个简单地重新抛出异常,我在调用方法中进行处理。这可能是最普遍的解决方案: public class ClientSimpleRethrow { public bool IsConnected { get; set; } public void Connect() {
WebRequest
连接到服务器。现在我正在努力解决如何最好地实现WebException
处理。要获得良好的UI反馈,我只需要(到目前为止)异常消息和状态
我想出了三种不同的方法。第一个简单地重新抛出异常,我在调用方法中进行处理。这可能是最普遍的解决方案:
public class ClientSimpleRethrow
{
public bool IsConnected { get; set; }
public void Connect()
{
try
{
// do connection
}
catch (WebException)
{
IsConnected = false;
throw;
}
IsConnected = true;
}
}
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;
}
}
第二个版本抛出一个自定义异常,其中WebException
作为内部异常。这给了我只捕捉和处理我所期望的东西的好处。例如,可能还有另一个bug,它也抛出了一个WebException
,我希望以不同的方式处理它。到目前为止,这是我最喜欢的解决方案:
public class ClientSimpleRethrow
{
public bool IsConnected { get; set; }
public void Connect()
{
try
{
// do connection
}
catch (WebException)
{
IsConnected = false;
throw;
}
IsConnected = true;
}
}
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;
}
}
我需要一些最佳实践建议,我应该选择哪一个以及为什么选择。我希望这个问题不要太主观,因为我真的认为,为什么选择一种设计而不是其他设计,应该有一些确凿的事实
提前感谢您的帮助 首先,我认为第三种方法不好。异常的好处在于,它们不会强制调用上下文在继续之前检查错误代码。在try块中,您可以编写代码,就像每个函数都成功一样。第三种方法去掉了这个细节,使调用代码看起来更复杂 至于前两个,我更喜欢第二个。在我看来,它有两个好处:
- 您可以创建一个异常类,它在应用程序的上下文中具有某种意义,而不是在底层API的上下文中工作
对API很好,但是如果您在尝试登录到某个系统时在方法中获得它,WebException
在应用程序的上层更有用LogInException
- 自定义异常允许您从基本的
类开始,然后在此基础上构建。从那里,您可以捕获API异常并尽快将它们转换为子异常。这样,当API异常波及到您的应用程序时,您会立即知道存在一些您没有考虑的情况,需要解决。其中,作为未捕获的应用程序异常只意味着您没有正确使用自己的代码MyApplicationException