Dot-Net
異常處理:throw 後終於執行了嗎?
假設您有以下程式碼:
而不是這樣做:
Try ' ' Initialize some objects ' ' ' do something that fails ' ' ' Clean up-code that gets not reached because exception ' Catch e As Exception ' 'Clean up initialized objects ' Throw e End Try我想要做:
Try ' ' Initialize some objects ' ' ' do something that fails ' Catch e As Exception Throw e Finally ' 'Clean up initialized objects ' End Try所以我的簡單問題是:如果出現異常,即使之前有 throw 一些行,是否也會到達 finally 塊?
[編輯] 感謝您的快速回答。
我認為在第一行會有 NullReference-、COM- 和 FileNotFound-Exceptions。
好的,我將使用此程式碼:
Try ' ' Initialize some objects ' ' ' do something that fails ' Catch e As Exception ' or just "Catch"?? Throw Finally ' 'Clean up initialized objects ' End Try一切順利!
聖歌
所以我的簡單問題是:如果出現異常,即使之前有 throw 一些行,是否也會到達 finally 塊?
是的。該
Finally塊始終1)執行並且精確地存在以進行清理。在您的程式碼中,刪除該塊,它什麼也不做。更糟糕的是,它實際上破壞了堆棧跟踪,因為您沒有重新拋出原始異常,而是拋出了一個新異常。Catch如果您確實需要一個
Catch塊然後重新引發異常,請使用以下命令:Catch e As XyzException ' … do some stuff. ' Throw End Try
- : Caveat emptor:有一些例外情況,例如
StackOverflowException(多麼合適……)需要特別注意並且可能不會觸發Finally阻塞。正確處理它們通常非常困難。