- PR -

MessageQueueの存在しないエラーコード

1
投稿者投稿内容
いも
常連さん
会議室デビュー日: 2006/01/26
投稿数: 31
投稿日時: 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文に入った後、何も実行せずに終わってしまいます。

同じように困っている方いらっしゃいませんか?
また、どのように回避していますでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-02 14:06
引用:

いもさんの書き込み (2007-05-02 11:33) より:

確かにキャッチ文には入ってくるのですが、if文に入った後、何も実行せずに終わってしまいます。


これは、if 内に制御が確実に移っているのにも関わらず、
Console.WriteLine メソッドが実行されないという意味でしょうか?

"何も実行せず" というのはどのように確認したのでしょうか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
いも
常連さん
会議室デビュー日: 2006/01/26
投稿数: 31
投稿日時: 2007-05-02 14:21
曖昧な記述ですみません

>これは、if 内に制御が確実に移っているのにも関わらず、
>Console.WriteLine メソッドが実行されないという意味でしょうか?

そうです。
実際はログの書き出し関数に飛んでいるのですがそちらに飛びません。
1行ずつ実行すると、その行にきた瞬間アプリが終わります。
ex=null;を先にしてもそうです。
アプリ終了の時なので、Application.Exit()が先に実行されて終わるんでしょうか??
終了の時以外にもここに入ってきて何もせずに終わられてしまうと嫌だなと思ったのです。。

この発生してしまう例外が特に害を及ぼさないのであればそれで良いのですけども、
この例外のせいでその後MessageQueueが使えなくなってしまうとか、そういうことがあると大変困るのです…。


(機知ではなく既知ですね…)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-05-02 14:28
本当に?

 「-1073741536 の時は例外を無かったことにしたいんだけど、if 文の中に入らない」ってのが、本当のところ何じゃない?


 ところで、「回避策」は、ごらんになりました?
引用:

入力者 Jeffery P 日付 2007/04/05
// Sometimes, this errors on EndPeek, but only on startup. Ignore if conditions below are met.
// Is this caused by the VS2005 debugger?
try
{
_queue.EndPeek(e.AsyncResult);
}
catch (MessageQueueException ex)
{
if (((int)ex.MessageQueueErrorCode == -1073741536) && (ex.GetBaseException() == null))
ex = null;
else
{
_exceptionCounter++;
WriteLogException(methodName, ex); // Log it
}

}
catch (Exception ex)
{
_exceptionCounter++;
WriteLogException(methodName, ex); // Log it
}


なんか、違いません?
_________________
いも
常連さん
会議室デビュー日: 2006/01/26
投稿数: 31
投稿日時: 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うんぬんが原因ではない気がしてきました
調べます…お騒がせしました
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-02 16:47
引用:

いもさんの書き込み (2007-05-02 14:21) より:

>これは、if 内に制御が確実に移っているのにも関わらず、
>Console.WriteLine メソッドが実行されないという意味でしょうか?

そうです。


そうじゃなかったみたいですね。(そう推測したからこそ "確実" と念押しして確認をしたのですが)

Visual Studio 2003 から 2005 に移るとハマりがちですが、
2005 では、次に実行する処理がない場合はブレークせずステップ オーバーします。
お気をつけください。

引用:

のところまでくると終了してしまいます。


これも同じことで、if に条件が合致しない == 次に実行する処理がないだと思います。

# それにしても ex = null; が理解できません...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
いも
常連さん
会議室デビュー日: 2006/01/26
投稿数: 31
投稿日時: 2007-05-02 17:33
>2005 では、次に実行する処理がない場合はブレークせずステップ オーバーします。

そうなんですか!

軽率な書き込みで申し訳ないです
1

スキルアップ/キャリアアップ(JOB@IT)