Try...Catch...Finally 陳述式 (Visual Basic)
更新:2007 年 11 月
提供在給定的程式碼區塊 (仍在執行中的程式碼) 發生的部分或所有可能錯誤的處理方式。
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try
參數
tryStatements
選擇項,發生錯誤的陳述式。可以是複合陳述式。Catch
選擇項,允許多個 Catch 區塊。在處理 Try 區塊時,如果發生例外狀況 (Exception),則會按文字順序檢查每一個 Catch 陳述式,以判斷它是否會利用代表已擲回之例外狀況的 exception 來處理例外狀況。exception
選擇項,任何變數名稱。exception 的初始值就是擲回的錯誤值。與 Catch 搭配使用以指定攔截的錯誤。如果省略,則 Catch 陳述式會攔截所有例外狀況。type
選擇項,指定類別篩選條件類型。如果 exception 的值為 type 所指定的型別或衍生型別 (Derived Type),則識別項會繫結到例外狀況物件。When
選擇項,只有在 expression 評估為 True 時,具有 When 子句的 Catch 陳述式才會攔截例外狀況。只有在檢查例外狀況的型別之後,才會套用 When 子句,而且 expression 可能會參考代表例外狀況的識別項。expression
選擇項,必須能夠隱含轉換為 Boolean。描述一般篩選條件的任何運算式。通常,用於按錯誤代碼篩選。和 When 關鍵字一起使用來指定何種環境下會攔截錯誤。catchStatements
選擇項,處理在關聯的 Try 區塊中所發生之錯誤的陳述式。可以是複合陳述式。Exit Try
選擇項,從 Try...Catch...Finally 結構中斷的關鍵字。執行會利用緊跟在 End Try 陳述式後面的程式碼繼續進行。仍將執行 Finally 陳述式。不可用於 Finally 區塊中。Finally
選擇項,當執行離開 Try 陳述式的任一部分時,一律會執行 Finally 區塊。finallyStatements
選擇項,在所有其他錯誤處理發生之後執行的陳述式。End Try
結束 Try...Catch...Finally 結構。
備註
來自 Try 區塊的區域變數是個別的區塊,所以無法在 Catch 區塊中使用。如果想在多個區塊中共用一個變數,請在 Try...Catch...Finally 結構外宣告該變數。
Try 區塊包含可能會發生錯誤的程式碼,而 Catch 區塊則包含會處理任何確實發生錯誤的程式碼。如果在 Try 區塊中發生錯誤,則程式控制權會傳遞至適當的 Catch 陳述式以進行配置。exception 引數是 Exception 類別 (Class) 或衍生自 Exception 類別之類別的執行個體。Exception 類別執行個體會對應至在 Try 區塊中發生的錯誤。此執行個體包含與錯誤有關的資訊。其中除了許多項目,還包括錯誤的編號和訊息。
如果 Catch 陳述式未指定 exception 引數,則會攔截所有類型的系統或應用程式例外狀況。在攔截您要的所有特定例外狀況之後,一定要使用這個變異形式做為 Try...Catch...Finally 結構中的最後一個 Catch 區塊。控制流程永遠無法到達接在不含 exception 引數之 Catch 後面的 Catch 區塊。
在部分信任的情況下,例如裝載在網路共用的應用程式,Try...Catch...Finally 不會攔截在叫用包含呼叫的方法前所發生的安全性例外狀況。當置於伺服器共用並予以執行時,下列範例會產生錯誤:"System.Security.SecurityException: Request Failed"。如需安全性例外狀況的詳細資訊,請參閱 SecurityException 類別。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Try
Process.Start("https://www.microsoft.com")
Catch ex As Exception
MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try
End Sub
在此種部分信任的情況下,您必須將 Process.Start 陳述式放在個別的 Sub 中。對 Sub 進行的初始呼叫將會失敗。這會使得包含 Process.Start 的 Sub 開始之前,且在產生安全性例外狀況之前,讓 Try...Catch 攔截到這項錯誤。
注意事項: |
---|
如果 Try 陳述式未包含至少一個 Catch 區塊,它必須包含一個 Finally 區塊。 |
範例
下列簡化的範例會說明 Try...Catch...Finally 陳述式的結構。
Public Sub TryExample()
Dim x As Integer = 5 ' Declare variables.
Dim y As Integer = 0
Try ' Set up structured error handling.
x = x \ y ' Cause a "Divide by Zero" error.
Catch ex As Exception When y = 0 ' Catch the error.
Beep()
MsgBox("You tried to divide by 0.") ' Show an explanatory message.
Finally
Beep() ' This line is executed no matter what.
End Try
End Sub