C# 抽象连接错误

C# 抽象连接错误,c#,connection,abstraction,C#,Connection,Abstraction,我有一个接口叫做IConnection public interface IConnection { bool IsConnected { get; } Task ConnectAsync(IEndPoint remoteEP); Task<int> SendAsync(byte[] data, int offset, int size); Task<int> ReceiveAsync(byte[] buffer, int offset,

我有一个接口叫做IConnection

public interface IConnection
{

    bool IsConnected { get; }
    Task ConnectAsync(IEndPoint remoteEP);
    Task<int> SendAsync(byte[] data, int offset, int size);
    Task<int> ReceiveAsync(byte[] buffer, int offset, int size);
    void Disconnect();
    void Close();

    event EventHandler<DisconnectedEventArgs> Disconnected;

}
公共接口i连接
{
布尔断开连接{get;}
任务连接异步(IEndPoint remoteEP);
任务SendAsync(字节[]数据,整数偏移量,整数大小);
任务接收异步(字节[]缓冲区,整数偏移量,整数大小);
无效断开连接();
无效关闭();
事件处理程序断开连接;
}
它由两种不同类型的连接实现——基于套接字的连接类和基于HTTP的连接类。我还想在将来添加其他连接类型的选项

在我的主ChatClient类中启动连接时,我将检查用户的配置,然后根据用户的喜好创建SocketConnection或HTTPConnection。从那时起,我只使用它的IConnection接口来引用连接

IConnection类有一个Disconnected事件,该事件在用户调用Disconnect或发生意外连接错误时引发。DisconnectedEventArgs将包含导致断开的原因的信息

我想知道的是,我如何抽象出不同类型的错误

套接字可能会遇到许多不同的错误情况,导致其断开连接,包括但不限于-

  • 远程端启动了正常断开连接(即读取返回0)
  • 读/写操作抛出一个带有标记SocketError.ConnectionAborted的SocketException
  • 读/写操作抛出一个带有标记SocketError.NetworkReset的SocketException
http连接还可能遇到许多不同的错误情况,例如-

  • 轮询远程服务器失败--例如。。主人突然消失了
  • HTTP身份验证凭据被拒绝
如何将套接字的所有可能错误和http连接的所有可能错误合并为一种类型

我是否使用包含所有可能错误值的枚举

我是否有一个简单的错误代码和错误描述


我应该处理多少套接字错误条件?只有我希望遇到的人?还是所有的?

为什么不让
DisconnectEventArgs
包含
公共异常错误{get;set;}
<当正常调用
Disconnect
时,code>Error为空,否则它包含套接字或Http异常。

为什么不让
DisconnectEventArgs
包含
公共异常错误{get;set;}
<当正常调用
Disconnect
时,code>Error为null,否则它包含套接字或Http异常。

我考虑过这一点,但我觉得这迫使用户代码了解所有底层连接类型,因此每次添加新连接类型时,都必须重构用户代码。另外,您知道有哪种生产代码可以执行类似的操作吗?在.NET框架中有什么东西吗?我喜欢遵循最佳实践,“用户代码”不应该关心错误的类型。它只需要知道发生了一些错误,然后向用户报告。但是如果每种类型的异常(SocketException、HttpConnectionException)都包含特定的信息,然后,在用户区中,需要将该异常转换为不同类型的异常,然后检查以获取更详细的信息,并将其呈现给用户。唯一的另一种方法是通过调用异常上的ToString()将其呈现给用户,据我所知,该方法只应该由程序员使用,而不是向用户显示。每个异常都有一条
消息
,只需向用户显示即可。可能前缀为“无法完成‘操作’,因为……”据我所知,该消息并非针对用户,仅针对程序员。我考虑过这一点,但我觉得这会迫使用户代码了解所有底层连接类型,因此,每次添加新的连接类型时,都必须重构用户代码。另外,您知道有哪种生产代码可以执行类似的操作吗?在.NET框架中有什么东西吗?我喜欢遵循最佳实践,“用户代码”不应该关心错误的类型。它只需要知道发生了一些错误,然后向用户报告。但是如果每种类型的异常(SocketException、HttpConnectionException)都包含特定的信息,然后,在用户区中,需要将该异常转换为不同类型的异常,然后检查以获取更详细的信息,并将其呈现给用户。唯一的另一种方法是通过调用异常上的ToString()将其呈现给用户,据我所知,该方法只应该由程序员使用,而不是向用户显示。每个异常都有一条
消息
,只需向用户显示即可。可能前缀为“无法完成‘操作’,因为……”据我所知,该消息并非针对用户,仅针对程序员。