【问题标题】:How best to handle an unexpected socket error?如何最好地处理意外的套接字错误?
【发布时间】:2013-02-08 18:27:49
【问题描述】:

我有一个聊天客户端类

class ChatClient
{
    Task ConnectAsync(string server);
    Task SendMessageAsync(string message);
    Task DisconnectAsync();
}

一旦用户连接了 ConnectAsync,他们就可以调用 SendMessageAsync 向其他用户发送消息。

在底层有一个 Connection 类,它是 Socket 类的一个非常基本的包装器。主要区别之一是它有一个 OnError 事件。

我还使用了一个可观察的消息流(响应式扩展),它从连接中读取数据并从服务器生成传入命令流。

我的问题是——当套接字产生错误时,我最好从哪里处理这个错误?我应该在 OnError 事件处理程序中处理它,还是应该从可观察流中截取错误并在那里处理?

无论哪种方式,我都看不到任何好处或坏处,所以我想知道最佳实践要求什么?

关于在连接类上进行事件的事情总是让我觉得有点 hacky,但我不知道为什么。

有什么建议吗?谢谢

【问题讨论】:

  • 我的 2 便士对此:当套接字产生错误时,我最好从哪里处理这个错误?我应该在 OnError 事件处理程序中处理它,还是应该从可观察流中截取错误并在那里处理它。我认为答案取决于应用程序。我个人喜欢将它一直传播回来(甚至是 UI)。这是因为这样前端有更多关于错误的信息来告诉用户,而不仅仅是网络错误。
  • 和我的第二个便士:在连接类上举办一个事件总是让我觉得有点 hacky。我不认为它是hacky。事实上,在某些实现中,我已经看到连接类发送回包含消息的事件。这可能是有道理的,对吧?因为数据是异步到达的。例如,当您执行 ConnectAsync 时,您如何知道连接是否已实际建立?你可能要问了,对吧?但询问需要轮询。这对我来说似乎更 hacky。

标签: c# sockets system.reactive


【解决方案1】:

我不得不说,最好的解决方案是对最终用户最透明的解决方案。如果错误以某种方式影响用户,则应通知他们或让他们选择如何继续。如果无法通知用户,则以便于未来改进的方式处理错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多