2015-04-02 67 views
3

我有以下的Try語句,儘管寫入數據庫的值太大,在此之後的所有內容都不會運行。 我應該寧願使用Exit Try而不是Exit Sub?退出嘗試與退出子

Try 

    Dim conn As OracleConnection 
    Dim cmdProduction As New OracleCommand 
    conn = GetConnect() 
    conn.Open() 
    cmdProduction.Connection = conn 
    cmdProduction.CommandText = "INSERT INTO PRODUCTION (DateTime, Plant, Runhours, Tons, Shift, Sft, Plant_Ord) Values ('" & DateTime & "','FM1-Selox','" & (seloxRuntime/60) & "','" & seloxTons & "','" & theShift & "','" & sft & "','51')" 
    cmdProduction.ExecuteNonQuery() 
Catch ex As Exception 
    WriteToFile("Production - Production : Database Error : " & ex.Message) 
    conn.Close() 
    Exit Sub 
Finally 
    conn.Close() 
End Try 
+0

你最大的問題是'趕上例外'。別。永遠。抓住。例外。這是糟糕的編程。你不妨在你的代碼中使用'Goto'。總是要捕捉特定的例外,只有你**可以正確處理。 – Enigmativity 2015-04-02 08:43:23

+0

這段代碼還有另一個主要問題:SQL注入=> [給我參數化的SQL,或者給我死亡](http://blog.codinghorror.com/give-me-parameterized-sql-or-give-me -death /) – 2015-04-02 09:16:07

回答

4

你不需要或者,請從Catchconn.CloseExit Sub,你是好去。 conn.Close將從Finally執行。

Try 
' 
' 
' 
Catch ex As Exception 
    WriteToFile("Production - Production : Database Error : " & ex.Message) 
Finally 
    conn.Close() 
End Try 

當然,如果你的示例代碼是不完整的,其實是這樣的:

Finally 
    conn.Close() 
End Try 

' More code 

然後要麼使用Exit Sub,或者剩餘代碼移動到Try

Try 
' 
' 
' 
' More code 
Catch ex As Exception 
    WriteToFile("Production - Production : Database Error : " & ex.Message) 
Finally 
    conn.Close() 
End Try 
+0

之後,對於不同的植物以及每個植物的不同錯誤消息有更多的嘗試語句。那麼我會使用Exit Sub嗎? 我什麼時候會用Exit Exit? – heinrich 2015-04-02 12:33:12

+0

@heinrich:這裏略微不清楚你在這裏提出的問題,但是如果你希望在這個塊之後執行子代碼中的其餘代碼,那麼你根本不需要使用任何東西,執行將會下降退出「Try/Catch/Finally」並繼續。如果你**不想在錯誤發生後繼續執行,那麼使用'Exit Sub'。 – 2015-04-02 15:09:10

+0

即使在我的閒談中,你仍然可以完美地解釋它。 – heinrich 2015-04-02 22:02:12