2013-10-25 31 views
1

我必须处理队列中的项目。尝试内部捕获以确保最终执行

从队列中删除项目是手动拨打Queue.DeleteMessage。无论处理是否成功,都需要这样做。

var queueMessage = Queue.GetMessage(); 

try 
{ 
    pipeline.Process(queueMessage); 
} 
catch (Exception ex) 
{ 
    try 
    { 
     Logger.LogException(ex); 
    } 
    catch { } 
} 
finally 
{ 
    Queue.DeleteMessage(queueMessage); 
} 

问题:

如果失败,我错误记录到的一些数据存储。如果此日志记录失败(可能数据存储不可用),我仍然需要将消息从队列中删除。

我已将LogException呼叫打包在另一个try catch中。这是正确的方式还是表演的东西?

回答

2

以下代码就足够了。 finally块即使在catch块中抛出异常时也会执行。

var queueMessage = Queue.GetMessage();  
try 
{ 
    pipeline.Process(queueMessage); 
} 
catch (Exception ex) 
{ 
    Logger.LogException(ex); 
} 
finally 
{ 
    Queue.DeleteMessage(queueMessage);//Will be executed for sure* 
} 
+1

'即使在catch块中抛出异常时,finally块也会执行。' - 我没有意识到这一点。很好,谢谢。 – davenewza

+0

@Alireza'它仍然未处理',除非和直到它被其他人抓住 –

+0

你提出的和PO的区别在于他的代码捕获了任何可捕获的异常 – Alireza

1

finally块总是执行,即使它抛出一个未处理的错误(除非它结束了应用程序)。所以是的。