2015-04-02 61 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