【问题标题】:RabbitMQ C# catch exception problemsRabbitMQ C# 捕获异常问题
【发布时间】:2013-03-23 21:11:52
【问题描述】:

我有一个简单的 C# 应用程序,它每秒向我的 RabbitMQ 交换器发送一条消息。当我的互联网连接断开时,应用程序会崩溃。所以我添加了一个 Try/Catch 语句,现在它不再崩溃了。但是,当连接恢复时,它将不再发送数据。我必须关闭应用程序,然后重新打开它。我这样做对吗?

   private void rabbitmqxmit()
    {
        try
        {
            while (rmqtxrun == true)
            {

                ConnectionFactory factory = new ConnectionFactory();
                factory.HostName = textBox3.Text;
                using (IConnection connection = factory.CreateConnection())
                using (IModel channel = connection.CreateModel())
                {


                    button1.BackColor = Color.Green;

                    string message = textBox1.Text;
                    byte[] body = System.Text.Encoding.UTF8.GetBytes(message);

                    channel.BasicPublish(textboxExchange.Text, textboxKey.Text, null, body);

                    txtboxTransmitting.Text = message;
                    button1.BackColor = Color.Gray;

                    Thread.Sleep(Convert.ToInt32(textBox4.Text));

                }


            }
        }
        catch {}
    }

【问题讨论】:

  • “我这样做对吗?”不,因为抑制错误不会让它消失。损害仍然存在——你只是再也看不到它了。了解正在发生的事情并修复程序。

标签: c# .net rabbitmq amqp


【解决方案1】:

当异常发生时,您实际上是在退出循环。为了得到你想做的事情,你需要在 while 循环中移动你的 try/catch。

但是,如果您找到了一种方法来测试连接而不是期待异常,那会更简洁。通过简单地接受任何异常并丢弃,您将失去看到其他可能出错的能力。最低限度,我会尝试仅捕获您期望发生的异常并将其记录在某个地方。

【讨论】:

  • RabbitMQ 在连接关闭时抛出EndOfStream 异常。关于连接测试,最好的测试方法是尝试使用它发送消息。
【解决方案2】:

您可能必须重新初始化频道 - 试试看。由于 using 子句,连接和通道将被很好地处理掉。如果 ConnectionFactory 也实现了 IDisposable,也可以在 using 子句中创建它。

此外,捕获所有异常而不对它们做任何事情是一种非常糟糕的方法。更好的方法是只捕获连接异常。

【讨论】:

  • 如何重新初始化频道?我会在 Catch 字段中添加声明吗?
猜你喜欢
  • 2011-03-16
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2011-08-19
  • 2012-12-07
相关资源
最近更新 更多