我的遺留代碼的簡單塊一個循環,通過節點的一些潛在的不良XML節點抓取的內坐着一個需要進行重構,因爲如預期它不工作:當Finally塊中的代碼拋出異常時會發生什麼?
Try
xmlFrag.LoadXml("<temproot>" & strXMLfragment & "</temproot>")
writer.WriteRaw(strXMLfragment)
Catch ex As Exception
InvalidXML = True
End Try
什麼該塊是意思是要做的是檢查有效的xml,然後寫出xml出來。它實際上所做的是檢查無效的xml,然後將xml寫出只有如果它是有效的。所以它需要被修復才能按預期工作。
我在修復的第一次嘗試:
Try
xmlFrag.LoadXml("<temproot>" & strXMLfragment & "</temproot>")
'writer.WriteRaw(strXMLfragment)
Catch ex As Exception
InvalidXML = True
Finally
writer.WriteRaw(strXMLfragment)
End Try
這個工作對我的測試數據,但我擔心WriteRaw可能會引發對其他數據的異常。我還沒有找到關於什麼將導致WriteRaw拋出異常的決定性陳述,以及當Finally block中的代碼拋出異常時會發生什麼。
所以,我試圖重寫它像這樣:
Try
xmlFrag.LoadXml("<temproot>" & strXMLfragment & "</temproot>")
Catch ex As Exception
InvalidXML = True
End Try
Try
writer.WriteRaw(strXMLfragment)
Catch
End Try
坦率地說,它看起來醜陋的地獄。有沒有更優雅的方式來重構這個或者第一次嘗試是否合適?
通常,您不應該將代碼放在Finally塊中,這可能會引發異常。很好的使用它會關閉數據庫連接,進行事務回滾等。在'Finally'塊中寫入文件可能會引發異常,與向外部服務等報告內容相同。 – Neolisk