- - PR -
MessageQueueの存在しないエラーコード
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-02 11:33
いつもお世話になっております。
現在C# 2005でWindowsアプリを開発しております MessageQueueを使ってプログラム間のやりとりをしているのですが アプリ終了の際にMessageQueueExceptionが発生します これは機知の問題で以下に報告されています https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=206533 要はMessageQueueErrorCodeに存在しないはずのErrorCodeを勝手に使われてしまって 例外が発生してしまうのですけれども、 これが catch (MessageQueueException ex) { if ((int)ex.MessageQueueErrorCode == -1073741536) { Console.WriteLine("mq exception!"); ex = null; } } のようにキャッチしても、確かにキャッチ文には入ってくるのですが、 if文に入った後、何も実行せずに終わってしまいます。 同じように困っている方いらっしゃいませんか? また、どのように回避していますでしょうか? | ||||||||
|
投稿日時: 2007-05-02 14:06
これは、if 内に制御が確実に移っているのにも関わらず、 Console.WriteLine メソッドが実行されないという意味でしょうか? "何も実行せず" というのはどのように確認したのでしょうか。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2007-05-02 14:21
曖昧な記述ですみません
>これは、if 内に制御が確実に移っているのにも関わらず、 >Console.WriteLine メソッドが実行されないという意味でしょうか? そうです。 実際はログの書き出し関数に飛んでいるのですがそちらに飛びません。 1行ずつ実行すると、その行にきた瞬間アプリが終わります。 ex=null;を先にしてもそうです。 アプリ終了の時なので、Application.Exit()が先に実行されて終わるんでしょうか?? 終了の時以外にもここに入ってきて何もせずに終わられてしまうと嫌だなと思ったのです。。 この発生してしまう例外が特に害を及ぼさないのであればそれで良いのですけども、 この例外のせいでその後MessageQueueが使えなくなってしまうとか、そういうことがあると大変困るのです…。 (機知ではなく既知ですね…) | ||||||||
|
投稿日時: 2007-05-02 14:28
本当に?
「-1073741536 の時は例外を無かったことにしたいんだけど、if 文の中に入らない」ってのが、本当のところ何じゃない? ところで、「回避策」は、ごらんになりました?
なんか、違いません? _________________ | ||||||||
|
投稿日時: 2007-05-02 16:16
>「-1073741536 の時は例外を無かったことにしたいんだけど、if 文の中に入らない」ってのが、本当のところ何じゃない?
そうですそうです! 回避策見てみました! _exceptionCounterというのはただ例外を数えているだけでしょうか?? 以下のようにしてみました try { ... mq.EndReceive(e.AsyncResult); ... } catch (MessageQueueException mex) { if ((int)mex.MessageQueueErrorCode == -1073741536 && (mex.GetBaseException() == null)) { mex = null; } else { WriteLog("ログ"); } } catch (Exception ex) { WriteLog("ログ"); } 上記の部分の、ブレークポイントを置ける行全てに置いて実行してみたのですが catch(MessageQueueException mex) {← のところまでくると終了してしまいます。 ちなみにクイックウォッチで見てみると (int)mex.MessageQueueErrorCode == -1073741536 はtrueで mex.GetBaseException() == null はfalseでした 終了ボタンクリックからずっと追っていくと、 Application.Exit()を過ぎて、Application.Run()の行に戻り、 Main()関数を終わってから、MessageQueueのReceiveCompletedイベントに入って、 例外を起こし、上記に至ります。 MessageQueueExceptionうんぬんが原因ではない気がしてきました 調べます…お騒がせしました | ||||||||
|
投稿日時: 2007-05-02 16:47
そうじゃなかったみたいですね。(そう推測したからこそ "確実" と念押しして確認をしたのですが) Visual Studio 2003 から 2005 に移るとハマりがちですが、 2005 では、次に実行する処理がない場合はブレークせずステップ オーバーします。 お気をつけください。
これも同じことで、if に条件が合致しない == 次に実行する処理がないだと思います。 # それにしても ex = null; が理解できません... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2007-05-02 17:33
>2005 では、次に実行する処理がない場合はブレークせずステップ オーバーします。
そうなんですか! 軽率な書き込みで申し訳ないです |
1