2013-03-23 56 views
0

我有一個簡單的C#應用​​程序,它每隔一秒就向我的RabbitMQ交換機發送一條消息。當我的網絡連接斷開時,應用程序會崩潰。所以我添加了一個Try/Catch語句,現在它不再崩潰。但是,當連接恢復時,它不會再發送數據。我必須關閉應用程序,然後重新打開它。我是否正確地做這件事?RabbitMQ C#捕獲異常問題

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 {} 
    } 
+0

「我正確地做了這件事嗎?」不,因爲抑制錯誤不會消失。損害仍然發生 - 你只是不再看到它。瞭解正在發生的情況並修復程序。 – usr 2013-03-23 21:17:07

回答

3

當發生異常時,您正在退出循環。爲了得到你想要做的事情,你需要在while循環中移動你的try/catch。

但是,如果您找到了測試連接而不是預期異常的方法,它會更乾淨。通過簡單地採取任何例外和傾銷,你失去了看到其他事情可能出錯的能力。最低限度我試圖只捕獲你期望發生的異常並將其記錄在某個地方。

+1

RabbitMQ在連接關閉時拋出'EndOfStream'異常。關於連接測試,最好的測試方法是嘗試使用它來發送消息。 – theMayer 2013-03-24 22:57:34

0

您可能需要重新初始化通道 - 試試。由於使用條款,連接和頻道將以不錯的方式處理。如果ConnectionFactory也實現了IDisposable,那麼也可以在using子句中創建它。

此外,這是一個非常糟糕的方法來捕捉所有異常,而不是對它們做任何事情。更好的方法是隻捕獲連接異常。

+0

我將如何去重新初始化頻道?我會在Catch字段中添加一條語句嗎? – user1876087 2013-03-23 21:36:05