Dot-Net

VB.NET 使用多個 Catch 塊嘗試 Catch

  • January 17, 2013

這是一個非常奇怪的問題。我們有一個帶有多個 Catch 塊的 Try Catch。第一個 Catch 塊沒有程式碼,只是一個註釋。

Try
 'Some Code
Catch ex As ThreadAbortException
 'Do Nothing
Catch ex As Exception
 HandleException(ex)
End Try

如果拋出除 ThreadAbortException 之外的異常,則如預期的那樣,它會被第二個 Catch 擷取。但是,在 VS2010 中單步執行程式碼時,ex 對像在這種情況下是 Nothing。到目前為止,我們已經找到了兩種方法來“修復”這個問題。

修復 1:重命名第一個異常變數。

Try
 'Some Code
Catch tex As ThreadAbortException
 'Do Nothing
Catch ex As Exception
 HandleException(ex)
End Try

修復 2:將任何程式碼行添加到第一個 Catch 塊。

Try
 'Some Code
Catch ex As ThreadAbortException
 Dim i As Integer = 1
Catch ex As Exception
 HandleException(ex)
End Try

在上述任何情況下,如果執行,HandleException 中的程式碼似乎仍然可以正常執行。這是 Visual Studio 或調試器中的錯誤嗎?還是我們在這裡遺漏了什麼,上面的第一段程式碼無效?

這一切都在 .NET 4.0 中完成。

Teejay 有正確的答案。

但是,如果您的Catch塊為空,則處理此異常完全沒有意義。您只想阻止最後一個塊擷取它。你可以使用你的方法——但是考慮到有一個空Catch塊通常是不可接受的:異常要麼不被擷取,要麼應該被正確處理;默默地吞下它們必須被視為一個錯誤。您的案例是此規則的一個例外,但因此需要在程式碼中記錄,否則會混淆細心的維護人員。

好吧,VB 有一個專門針對這種情況的習慣用法:

Try
   ' …
Catch ex As Exception When Not TypeOf ex Is ThreadAbortException
   ' Only executed if `ex` isn’t a ThreadAbortException
End Try

這段程式碼根本沒有捕捉ThreadAbortException到,如果你不想處理它,這是正確的做法:ThreadAbortException 不能被吞下,所以即使你捕捉到它,它也會在Catch塊的末尾重新拋出。

請注意,這與 SysDragon 的答案根本不同,後者使用正常If語句,而此處的程式碼使用語句中的特殊子句Catch作為過濾器。

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