Try Catch能幫你做什麼(2)?

這一篇來說說關於例外處理的When和Finally

        在這個系列的(1)裡面,fPhoenix建議我應該把「除錯」改為「捕捉例外」,的確在MSDN文件中也是以「例外處理」來稱呼,可參閱Visual Basic 的結構化例外處理概觀。這一篇來說說關於例外處理的When和Finally,When 基本上是加在Catch ex as Exception 的後面﹝當然你不一定會用ex,這個Execption也是多彩多姿的﹞,以下面這個MSDN上的例子而言:﹝我有小改一些,不過差不多啦﹞

 
Public Sub TryExample()
        Dim x As Integer = 5
        Dim y As Integer = 0
        Try
            x = x / y
        Catch ex As Exception When y = 0
            Label1.Text = "Error"
            MsgBox("發生除以0的錯誤")
            Exit Sub
        Finally
            Label1.Text = "Finally"
        End Try
 
    End Sub
 
Catch ex As Exception When y = 0 這一行表示當有例外發生的時候,只有y=0的狀況會進入Catch 區塊中處理,如果此時我們在宣告部份把
Dim y As Integer = 0 改為 Dim y As Integer = 1
以及 x = x / y 改為 x = x / 0
 
在執行時一樣會發生除以0的錯誤,但是卻不會進入Catch區塊內處理,因為此時y=1,並不符合y=0的條件,當然When的功能不是這麼膚淺,以我的經驗而言當某種Exception會丟出獨特的Error Code,而且可能要針對不同的Error Code做處理理時,When就挺好用的,像是SocketException可以藉由其ErrorCode屬性將問題分門別類:
Catch SoEx As SocketException When SoEx.ErrorCode = 996
關於Error Code請參閱Windows Sockets Error Codes
 
繼續下來講Finally區塊,在MSDN裡面特別說到,只要程式碼進了Try區塊後,無論如何Finally區塊的內容都一定會執行,以前面的例子來看,如果我們把Exit Sub拿掉,然後把Label1.Text = "Finally"放在區塊外,其實還是會執行,不過可能會有風險。但我放在Finally區塊內,即使我在Catch區塊內放了Exit subLabel1.Text = "Finally"還是會乖乖的執行。如果你把程式改成如下的形式:
 
Public Sub TryExample()
        Dim x As Integer = 5
        Dim y As Integer = 0
        Try
            x = x / y
        Catch ex As Exception When y = 0
            Label1.Text = "Error"
            MsgBox("發生除以0的錯誤")
            Exit Sub
        Finally
          
        End Try
Label1.Text = "Finally"
    End Sub
 
你將發現Label1.Text = "Finally"並沒有被執行到,所以Finally區塊就是為了確保該程序中最後該執行的事都有做到,而不會因為例外又牽扯出其它原本可避面的例外。

後記1》When子句在C#是不能使用的,感謝KennyShu大大的指教