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的上下文中工作
    WebException
    对API很好,但是如果您在尝试登录到某个系统时在方法中获得它,
    LogInException
    在应用程序的上层更有用

  • 自定义异常允许您从基本的
    MyApplicationException
    类开始,然后在此基础上构建。从那里,您可以捕获API异常并尽快将它们转换为子异常。这样,当API异常波及到您的应用程序时,您会立即知道存在一些您没有考虑的情况,需要解决。其中,作为未捕获的应用程序异常只意味着您没有正确使用自己的代码


为什么不干脆扔掉ex;因为如果重新抛出ex,原始堆栈跟踪信息将被覆盖。这些也是我的反射。我将进行第二次实施,如果有第二种意见,我会感觉更好。谢谢