微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NetMQ 未处理异常最佳实践

如何解决NetMQ 未处理异常最佳实践

我将 NetMQ 用于客户端/服务器通信,作为定价系统,使用 Pub/Sub 获取价格数据,使用 Req/Res 获取 C&C。除了我看到 NetMQ 库内部发生随机且不可重现的异常外,它运行良好。

我目前在 Windows Server 2008R2/20012R2 上的 .Net v4.7.2 堆栈上使用 NetMQ v4.0.1.6。

例外情况包括

  • NetMQ.FaultException @ NetMQ.Msg.Close()
  • System.ArgumentOutOfRangeException @ NetMQ.Core.Patterns.Utils.ArrayExtensions.Swap[]
  • system.indexOutOfRangeException @ NetMQ.Core.Utils.YQueue`1[]/NetMQ.Core.Patterns.Utils.Trie.Check()
  • System.Net.sockets.socketException @ NetMQ.Core.MailBox.TryRecv()/NetMQ.Core.MailBox.Send()
  • System.NullReferenceException @ NetMQ.Core.Patterns.Utils.Trie.ApplyHelper()/NetMQ.Core.Patterns.Utils.Trie.Check()
  • System.ObjectdisposedException @ NetMQ.Core.socketBase.Checkdisposed()

并且都发生在 NetMQ.NetMQPoller.RunPoller() 或 NetMQ.Core.Utils.Proactor.Loop() 中,我不知道如何捕获和缓解它们。

使用 NetMQ 强化服务/应用程序以防止此类异常导致服务中断的正确方法是什么?

解决方法

我在一家大型组织中以专业的方式完成了这项工作,并取得了巨大的成功。

最佳实践是在循环中包含一个 try catch 处理程序,然后执行如下操作

(从您的列表中随机抽取的错误类型示例)

/*loop*/(/*loop condition*/) {
  try {
    // processing
  } 
  catch (NetMQ.FaultException $exception) {
    // specific error handling
  } 
  catch (System.ObjectDisposedException $exception) {
    // specific error handling
  }
  catch (Exception $exception) {
    // generic error handling
  }
}

此外,您可以随意向它传递一个特定的错误处理类/服务,以将您的错误处理功能卸载到一个单独的位置(更好的可测试性)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。