2013-10-25 33 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塊總是執行,即使它拋出一個未處理的錯誤(除非它結束了應用程序)。所以是的。