2013-07-02 46 views
4

我有一小段代碼調用Web服務客戶端方法。嘗試finally塊中記錄異常的詳細信息

該方法返回一個消息數組作爲out參數。這些消息常常包含發生的任何錯誤的詳細信息。發生錯誤時也會拋出異常。

我想記錄消息,無論是否拋出異常或異常的類型。登錄finally塊可接受的做法?

WebServiceClient client = GetWebServiceClient(); 
Console.WriteLine("Calling getUpdates..."); 
ItemStatus[] itemStatuses; 
Message[] messages = null; 
string outToken; 
try 
{ 
    outToken = client.getUpdates(inToken, out itemStatuses, out messages); 
} 
finally 
{ 
    LogMessages(messages); 
} 
+1

這種安排有點不同尋常,但是鑑於它不適合討論,有什麼理由可以反對這樣的日誌?這很自然,很好。 – Jon

+1

在'messages'被分配一個有用的值之前,如果'getUpdates'拋出一個異常(webservice調用超時,...),怎麼辦? –

+0

是的,在某些情況下,消息將爲空或爲空,並檢查這些情況。我只是想確定消息是否包含任何有用的記錄。 – TonE

回答

5

是,finally塊總是會執行(即使在沒有拋出異常)。所以在這種情況下將Logging放在那裏是有道理的。

+0

謝謝 - 我想第二個意見,這是一個可以接受的方法。 – TonE

2

I finally塊將始終執行,無論是否引發任何異常。

如果這是你的完整代碼,那就沒問題。如果沒有,我建議在記錄消息變量之前進行一些空的檢查,因爲當拋出異常時它可能不會被初始化。

我認爲這樣的記錄非常公平。

編輯:

我忘了提,有一些corner cases,這將最終阻止執行 - 我不相信這是你的情況,但值得一提的(感謝Simon指點它出來了!)。

另外,我喜歡的finally方法,如果你想,即使你的方法返回你的方法來登錄。

+2

這不完全準確。確實有異常會導致finally塊不執行。 –

+0

感謝您指出!編輯我的答案以反映這一點。 – Joel

+0

不用擔心。我不會提到它,除了你的措辭聽起來如此明確:) –