2014-02-19 47 views
-1
try/catch塊

是的,我知道,GOTO是錯誤的,我每次使用它小貓死亡時間;)還有一兩件事讓我好奇:GOTO在VB.NET

如果我在嘗試使用GOTO什麼/ catch塊

Try 
...some code... 
Catch 
...some code... 
    GoTo Label1 
End Try 
...some more code to be skipped if error 
Label1: 
...rest of code... 

我是否正確理解try/catch塊永遠不會在程序中關閉,並且可能會導致問題?或不?

似乎也有一些OnError GoTo命令,但我沒有太多的經驗。也許我的代碼可以使用它重寫?

+1

有關GoTo的推理很難,因此強烈建議不要使用它。通過在例外情況下談論「封閉」,可以讓它變得更加困難。這不是一個有意義的短語,異常不像文件或套接字。在Catch塊中的代碼開始運行時,任何事情都不需要「關閉」,異常的所有副作用都已經完成。並且代碼將繼續運行通過Catch塊,無論您是落入還是跳入其中。 –

回答

4

難道我理解正確的是因爲你離開它的try/catch塊永遠不會關閉

不行,try/catch塊將被關閉。 It is okay to jump out of the try/catch block

但是,代碼應該重寫:

Try 
    ...some code... 
    ...some more code to be skipped if error 
Catch 
    ...some code... 
End Try 

...rest of code... 
+1

如果你需要任何代碼運行,無論錯誤與否後嘗試然後使用'最後'的聲明...嘗試 - 捕捉 - 最後 - 結束嘗試 – Mych

3

這可能是有益的,瞭解.NET框架內部一點兒:

異常處理是通過例外支持的CLI對象和受保護的代碼塊。

(CLI =公共語言基礎結構)

在CLI中,一種方法可限定的範圍內的CIL指令被說成是保護。這被稱爲嘗試塊。然後,它可以將一個或多個處理程序與該嘗試塊相關聯。如果在try塊中的任何地方執行過程中發生異常,則會創建一個描述該問題的異常對象。然後,CLI接管,將控制從拋出異常的位置轉移到願意處理該異常的代碼塊。

這一切都是以聲明方式完成的。因此,基本上,Try,Catch,End Try等項目不會作爲指令發出 - 編譯器說「如果在此範圍的指令中發生異常,這裏是可能的處理程序跳轉到」。當發生異常時,它只會查詢這些信息。所以,你的關注:

的try/catch塊永遠不會關閉

是無效的,因爲一個機制,讓受保護的區域是...(請打起鼓)...移到該指令範圍之外。這並不重要這是如何完成的 - 它可能只是通過用盡保護範圍的末端,或通過GOTO或通過例外。


前兩個引號來自MS分區I(第12.4節)。2)和MS分區II(部分19)可用於下載的文件從ECMA C# and Common Language Infrastructure Standards

科分區的12.4.2我還指出:

受保護區域時,相關的處理程序的類型,和的位置用戶提供的過濾器代碼通過與每種方法關聯的異常處理程序表來描述