c# - NetMQ 未处理异常最佳实践

标签 c# .net zeromq netmq

我将 NetMQ 用于客户端/服务器通信,作为定价系统,使用 Pub/Sub 获取价格数据,使用 Req/Res 获取 C&C。除了我看到 NetMQ 库内部发生随机且不可重现的异常外,它运行良好。
我目前在 Windows Server 2008R2/20012R2 上的 .Net v4.7.2 堆栈上使用 NetMQ v4.0.1.6。
异常(exception)情况包括:

  • 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
      }
    }
    
    此外,您可以随意将特定的错误处理类/服务传递给它,以将您的错误处理功能卸载到一个单独的位置(更好的可测试性)。

    关于c# - NetMQ 未处理异常最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66660127/

    相关文章:

    c# - 如何在不将 RequestValidationMode 设置为 2.0 的情况下禁用请求验证?

    php - Xampp 上的 ZMQ (Windows)

    c++ - 一段时间后 zmq 套接字不工作

    c# - 最小化到托盘使表单不可见

    c# - 模板方法模式——防止在派生类中直接调用方法

    c# - 在这种情况下,我应该对所有可能的输入进行单元测试吗?

    .net - System.Int32.ToString() 可以指定自定义基数吗?

    .net - String.Split 不删除拆分文本,仅删除第一个字母

    c++ - ZMQ请求发送保证

    C# 应用程序缓存 block