我知道你不應該爲非例外情況使用異常,但我想運行這個過去的其他程序來看看我想要做的事情真的很糟糕。在正常代碼流中使用異常
我有一個例程試圖從MSMQ消息隊列中獲取消息。如果隊列中沒有消息可用,則會檢查輔助來源以查看消息是否可用。例程如下:
void CheckForMessages(out Message msg, TimeSpan timeout)
{
try
{
queue.Peek(timeout);
}
catch(MessageQueueException ex)
{
if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
{
if (messageAvailable)
{
msg = SecondaryMessageSource();
}
}
throw;
}
msg = queue.Receive();
}
MSMQ不提供檢查隊列上消息計數的機制。確定消息是否可用的唯一方法是使用Peek。如果發生MessageQueueException並將其錯誤設置爲IOTimeout,則Peek超時並且隊列上沒有消息可用。
此例程將在線程的一個循環中調用,該線程的唯一目的是檢索消息。超時將在毫秒範圍內。調用堆棧由單個方法組成,線程負責不做任何事情。我知道這種方法會不斷地拋出異常,這被認爲是不好的做法,但在這種情況下,它真的很糟糕嗎?如果是這樣,沒有任何人有任何建議,如何完成這項任務,而沒有代碼變得完全錯綜複雜?
會是什麼替代使用'Peek'? – 2013-05-13 11:26:28