2011-09-15 19 views
3

try/catchブロックとIOTimeoutに依存しないように、次のコードブロックを変更するにはどうすればよいですか?この関数は1分ごとに呼び出されます。だから私はちょうどこれの最後の呼び出しの後にキューに入れられたIDのリストを処理したい。try/catchを取り除く - メッセージキューから読み取る

私は何のメッセージがキューで待機していなかったヌルを受け取った場合は、それは私の問題を解決してきただろうが、(私はスレッドをブロックすることはできません)同期している受信のAPI http://msdn.microsoft.com/en-us/library/system.messaging.messagequeue.receive.aspx は、すべての署名を示したりしてMessageQueueException try/catchブロックによってタップしなければならない例外。プログラムの流れを制御するためにtry/catchを使用しないことを提案している記事を読んだ後、私は避けたいものでした。

#pragma warning disable 
    public void ConsumeEvents2() 
    { 
     var listOfJobs = new List<int>(); 

     try { 
      while (true) { 
       // receive all messages and add in a list to process later 
       Message message = messageQueue.Receive(new TimeSpan(0,0,3)); 
       JobEvent evt = (JobEvent)message.Body; 
       listOfJobs.Add(evt.DataNumber); 
      } 
     } catch (MessageQueueException e) { 
      if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) { 
       // process the numbers received 
       ProcessJobList(listOfJobs); 
       return; 
      } 
      throw; 
     } 

    } 
    #pragma warning restore 
+0

それはWinフォームアプリケーションですか? – CharithJ

+0

これはウェブアプリですが、問題ではありません。あなたはまだアプリケーションレベルの例外をキャッチしています –

答えて

1

例外は、メインスレッド上または中に(アプリケーション内の任意の場所にスローされたときにWindowsは、フォームアプリケーションで直接アクセスしないようにしてくださいすることは、microsoft-

using System; 
using System.Windows.Controls; 
using System.Windows.Messaging; 

namespace ReceivingApplication 
{ 
    public partial class Receiver : UserControl 
    { 
    public Receiver() 
    { 
     InitializeComponent(); 

     LocalMessageReceiver messageReceiver = 
      new LocalMessageReceiver("receiver", 
      ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain); 
     messageReceiver.MessageReceived += messageReceiver_MessageReceived; 
     try 
     { 
      messageReceiver.Listen(); 
     } 
     catch (ListenFailedException) 
     { 
      output.Text = "Cannot receive messages." + Environment.NewLine + 
       "There is already a receiver with the name 'receiver'."; 
     } 
    } 

    private void messageReceiver_MessageReceived(
     object sender, MessageReceivedEventArgs e) 
    { 
     e.Response = "response to " + e.Message; 
     output.Text = 
      "Message: " + e.Message + Environment.NewLine + 
      "NameScope: " + e.NameScope + Environment.NewLine + 
      "ReceiverName: " + e.ReceiverName + Environment.NewLine + 
      "SenderDomain: " + e.SenderDomain + Environment.NewLine + 
      "Response: " + e.Response; 
    } 
    } 
} 
0

から、このコードを見てみましょう非同期呼び出し)、アプリケーションでThreadExceptionイベントを登録することでそれを捕まえることができます。このようにして、すべてのメソッドに対してtry/catchを追加する必要がなくなります。 ASP.NETアプリケーション

については

Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod) 

private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t) 
{ 
    //Exception handling... 
} 

Application.ThreadException Event

System.Web.UI.TemplateControl.Errorイベントのハンドラを作成し、ページ内のグローバルハンドラを作成するには。 アプリケーション全体のエラーハンドラを作成するには、Global.asaxファイルで System.Web.HttpApplication.Errorイベントにコードを追加します。処理されない例外がページまたはアプリケーション内のどこでも発生する場合、これらのメソッドは と呼ばれ、それぞれ となります。 GetLastErrorメソッド から最新のエラーに関する情報を取得できます。

以下は興味深いスレッドです。

.NET - What's the best way to implement a “catch all exceptions handler”

Why global.asax Application_Error method does not catch exceptions thrown by ASMX service?

global.asax Application_Error not firing

+0

コードの他の部分でスローされる可能性のある他の例外はどうなりますか?これは他のすべての例外を飲み込まないでしょうか?ハンドラから例外を元に戻して元の場所からスローされたように見せる方法はありますか? –

+0

@ Ryan S:このメソッドはすべての例外をキャッチします。ここから例外タイプ(Eg:ListenFailedException)を特定し、1か所から適切に処理できます。はい、元の場所からスローされた例外が再スローされます。 – CharithJ

関連する問題