我知道你不应该在非异常情况下使用异常,但我想通过其他人来看看我想做的事情是否真的那么糟糕。
我有一个例程试图从 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 已超时并且队列中没有可用消息。
该例程将在一个线程的循环中调用,该线程的唯一目的是检索消息。超时将在毫秒范围内。调用堆栈由单个方法组成,线程不负责其他任何操作。我知道该方法会不断抛出异常,这被认为是不好的做法,但在这种情况下,真的有那么糟糕吗?如果是这样,是否有人对如何在不使代码变得完全复杂的情况下完成此任务有任何建议?