我开发的许多应用程序都涉及到已有应用程序的数据库(我主要针对那些试图以低成本扩展的小型企业开发);很多这类工作都涉及从其他应用程序中获取信息。数据库(例如"网站名称"等)。 我通常有类库来完成这种工作,尽可能节省数据库调用。例如,我可能有如下函数:
Private Function GetSiteName(ByVal dbPath As String) As String
Dim returned As String
Dim conn As New AdsConnection("data source = " & Path & "; ServerType=remote|local; TableType=CDX")
Dim cmd As AdsCommand
Try
conn.Open()
cmd = conn.CreateCommand()
cmd.CommandText = "select stSiteName from Sites;"
returned = cmd.ExecuteScalar
conn.Close()
Return returned
Catch e As AdsException
' write to log here
End Try
End Function
(对于那些不熟悉的人,在上面的特定示例中,我从Advantage Database Server访问数据库)。
在上面的例子中,我会收到一条警告,说明并非所有代码路径都返回一个值。如果我将Return
语句移到End Function
之前(Try...Catch
块之外,我会收到警告,说明该变量可能未初始化。
是否有标准/首选方式处理此问题?目前我通常会将错误消息放入返回的值中,然后从调用代码中测试它,但对我来说感觉笨重。
答案 0 :(得分:3)
问题是您在函数中处理了异常。处理的异常对调用者是透明的,即该函数外部的代码无法确定是否引发了异常。只有当函数行为正确时,即使引发异常(因此可以处理),此设计才是正确的。
执行catch
语句时,函数不知道要返回什么值。那就是问题所在。你不应该在这个级别捕获异常。您应该让异常提升,然后将其提升到较高级别,您可以在其中向用户显示相应的错误消息。
答案 1 :(得分:-1)
您遇到的问题与错误处理无关。如果函数没有在所有代码路径上返回某些内容,编译器会发出警告,您可以选择忽略它,因为它没有被归类为Error
。
例如如果If...Else
或If
内的代码未返回值,则会向Else
发出相同的警告。同样,如果Select..Case
块中至少有一个没有返回值,您将在Case
块中收到警告。
不过要注意编译器发出的警告,并尽量减少此类警告的数量。
围绕这个问题有两种方法。
虽然上述哪个更好是有争议的,但我个人喜欢第二种方法。从代码维护的角度来看也是更好的(当函数太大时)。
例如,您可以使用空值初始化变量,也可以不使用任何内容来消除该警告。
Dim returned As String = String.Empty
...
Try
...
Catch e As AdsException
...
End Try
...
Return returned
在此示例中,您有4个代码路径,函数可以从中退出(在上面的示例中由...
显示)。假设您有10或15.如果您没有在任何代码路径上设置返回值,则会收到警告。上述解决方案通过在开头初始化变量并在结束时返回它来解决问题。那么你不必担心哪个代码路径设置了变量,哪个没有。