1

我正在编写一个即时消息库。目前,当在读取或写入套接字时引发 SocketException 时,我从应用程序内部启动注销例程,将 SocketException 作为 LogoutEventArgs 的参数传递给最终用户。这为最终用户提供了一种查看底层异常实际导致未请求注销的方法。

我的问题是,如果在用户调用 Logout 函数期间,套接字实际上抛出了异常,我该怎么办。

示例 - 最终用户调用 Logout 函数,并且当 logout 函数正在等待现有请求正常结束时,套接字在读取线程中抛出异常。

在我看来,我有两个选择-

  1. 假装错误没有发生,就像我们的注销过程中断开的套接字一样。

  2. 当引发套接字异常时,查看是否正在发生注销请求,如果是,则覆盖它。导致原始注销请求引发 AlreadyLoggedOutException,以及在 LogoutEventArgs 中传递异常的单独注销事件。

此外,稍微相关 - 如果服务器启动未请求的关闭,我该怎么办(即.. 读取调用返回 null).. 如果您向它发送请求,.NET Messenger 服务器倾向于执行此操作不喜欢。我是否将其视为一个例外?

我发现我的图书馆的整个断开/注销部分是我身边的主要刺。我似乎无法绕过它。有谁知道任何可以很好地处理这种情况的开源代码应用程序?

我一直试图在脑海中解决这个问题,这让我发疯。

4

1 回答 1

0

我决定不将 SocketException 传递给最终用户,因为断开连接并不是真正的异常,应该被预期和处理。相反,LogoutEventArgs 上有一个 LogoutReason 属性,它指定了注销发生的原因。

我决定如果在注销期间发生断开连接,那么这实际上并不是一个例外,因为注销无论如何都会断开连接。在这种情况下,我只是忽略了例外。

于 2012-04-10T21:47:03.663 回答