2011-05-27 24 views
5

我從SO複製一段代碼作爲例子。子例程包含一個錯誤處理程序。應該爲所有Subs製作一個錯誤處理程序嗎?我們是否需要爲每個子例程創建一個錯誤處理程序?

Public Sub SubA() 
    On Error Goto ProcError 

    Connection.Open 
    Open File for Writing 
    SomePreciousResource.GrabIt 

ProcExit: 
    Connection.Close 
    Connection = Nothing 
    Close File 
    SomePreciousResource.Release 

    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 

順便說一下,如何做一個子程序內部的控制流時,代碼執行遇到Exit SubEnd SubResume?在執行過程中遇到諸如ProcError:這樣的標籤時,它是執行它還是跳過它?

回答

2

退出小組將退出子程序立刻像Java中返回

結束子只是對於像的子程序塊的末尾中的Java

標記}標籤是簡單地在代碼的標記這是用來定義一個跳轉目標。如果您沒有跳轉到標籤但是「定期」到達那裏,標籤本身將被忽略,但標籤後面的代碼將被執行,就好像沒有標籤一樣,您示例中的代碼將一直執行到只要沒有錯誤發生,就退出Sub語句。如果一個occures它會跳到ProcError

簡歷會在這種情況下執行ProcExit看到更多here

+0

你說標籤塊將被忽略,但它是如何識別塊並將其與代碼的其餘部分分開? – lamwaiman1988 2011-05-27 07:53:13

+1

@ gunbuster363:我認爲@ cmmi的聲明是正確的,雖然不是很清楚。 「標籤將被忽略」的含義是:標籤本身在執行時不執行任何操作。但是,標籤之後的代碼(你稱之爲「標籤塊」)肯定不會被忽略並且會被執行。 – 2011-05-27 08:07:13

+0

我想我現在明白了。 – lamwaiman1988 2011-05-27 08:10:04

9

簡短的回答是:不,你不僅不需要有錯誤處理程序中的每個程序,但實際上你通常不會在每個過程中出現想要錯誤處理程序。

你會想要做錯誤處理,最有意義的地方去做。通常情況下,您只需要最高級過程中的錯誤處理程序,即調用所有其他程序的錯誤處理程序;較低層次的程序應該在樓上解決問題,並讓錯誤「冒泡」到更高層次的程序。有時你會想在低級過程中進行一些錯誤處理。

如需更多信息,請您看看這兩個優秀的答案被@jtolle:

此外,互聯網搜索,就會發現有一個整體上的文獻該網頁關於錯誤處理。在我看來,它有些是錯誤的!但如果它堅持我在前兩段中寫的內容,那麼值得考慮。

Exit SubEnd Sub相當直觀:前者停止執行當前Sub並將控制返回給調用它的過程(或者如果過程未被另一過程調用,則完全停止執行)。後者只是向編譯器指示此處特定Sub的代碼結束的位置 - 如果執行,則End Sub的行爲與Exit Sub的行爲相同。

Resume指定在錯誤處理例程完成後接下來應該發生什麼。原始Resume返回到導致錯誤的同一語句並嘗試再次執行它。 Resume Next跳過導致錯誤的語句,而是跳轉到緊跟其後的語句。 Resume mylabel轉到標籤mylabel:

如果在執行過程中遇到ProcError:等標籤,則不會發生任何特殊情況,並且執行會轉到標籤後面的下一個語句。當然,在你的例子中,ProcError:將永遠不會被直接執行(即除非產生錯誤),因爲在它之前有Exit Sub


順便說一句,在ProcExit:塊也許應該有On Error Resume Next開始(即保持在關閉的一切,無論任何錯誤的退出),或者,由@Phydaux指出,一個On Error Goto 0(上錯誤,停止執行),否則如果那裏有東西觸發錯誤,你可能會進入錯誤處理程序和代碼之間的無限乒乓循環。

ProcExit: 
    On Error Resume Next ' or, alternatively, On Error Goto 0 
    Connection.Close 
    Connection = Nothing 
    Close File 
    SomePreciousResource.Release 
Exit Sub 
+0

@Jean:錯誤處理程序標籤後面的錯誤繼續下一個是+1。讓我重新思考我在做什麼。但是,如果我想在執行錯誤後執行該行,該怎麼辦?在這種情況下使用「下一個繼續」可以嗎?希望你能得到我想說的話(英語不是我的母語)。 – Oneide 2011-05-27 12:27:40

+1

對於ProcExit:部分,「On Error GoTo 0」也可能適用。但是你肯定想要一個或另一個,否則你會面臨無限循環的風險。 – 2011-05-27 13:02:31

+0

@Oneide:你的意思是,做錯誤處理,然後繼續執行導致錯誤的語句之後的行?是的,在這種情況下,「Resume Next」應該是錯誤處理程序的最後一個語句。說實話,我從來沒有真正找到一個很好的理由來做到這一點。 – 2011-05-27 13:08:04

相關問題