Dot-Net

異常處理:throw 後終於執行了嗎?

  • October 16, 2009

假設您有以下程式碼:

而不是這樣做:

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

  1. : Caveat emptor:有一些例外情況,例如StackOverflowException(多麼合適……)需要特別注意並且可能不會觸發Finally阻塞。正確處理它們通常非常困難。

引用自:https://stackoverflow.com/questions/1577049