【问题标题】:Confused about try...except in vb [closed]对尝试感到困惑......除了vb [关闭]
【发布时间】:2020-03-08 10:59:29
【问题描述】:

我正在开发一个允许用户按名称搜索排行榜数据库的项目。如果数据库不包含名称,我被鼓励使用 try...except 语句来停止错误,但我不熟悉如何使用它,所以我遇到了问题。请问我可以在哪里出错以及如何纠正它方面获得帮助吗?我希望记录显示搜索的名称,或者如果名称不存在,则不显示任何记录。


    Imports System.Data.OleDb
    Public Class FrmAllResults
        Dim CtnConnection As OleDbConnection
        Dim DsDataset As New DataSet()
        Dim StrConnectionString As String = vbNull
        Dim StrSql As String
    Private Sub FrmAllResults_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            StrConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\..\..\DbIteration2Database.mdb"
            StrSql = "select * from Leaderboard"
            CtnConnection = New OleDbConnection(StrConnectionString)
            CtnConnection.Open()
            Dim AdptOleDbAdapter As OleDbDataAdapter = New OleDbDataAdapter(StrSql, CtnConnection)
            AdptOleDbAdapter.Fill(DsDataset)
            AdptOleDbAdapter.Dispose()
            LblAllResults.Text = DsDataset.Tables(0).ToString
        End Sub
        Private Sub BtnSearch_Click(sender As Object, e As EventArgs) Handles BtnSearch.Click
            Dim StrNameSearched As String = TxtName.Text
            Dim StrLeaderboardEntry As String
            Try
                StrLeaderboardEntry = (DsDataset.Tables(0).Rows(0).Item(StrNameSearched).ToString)
            Catch ex As Exception
                StrLeaderboardEntry = vbNull
            End Try
            LblAllResults.Text = StrLeaderboardEntry
        End Sub
    End Class

【问题讨论】:

    标签: database vb.net try-catch


    【解决方案1】:

    您可能对此感到困惑,因为这是对异常处理的错误使用。 (而鼓励你这样做的人误导了你。)例外是代码中的意外错误。

    例如,如果代码根本无法连接到数据库,那么它可能会生成异常,并且应用程序应该能够从该异常中恢复。在数据中找不到匹配的记录也不例外。这不是错误。这只是一个简单的“未找到结果”的情况。

    问题是代码assumes 找到了结果,并且在这里人为地生成错误作为结果:

    StrLeaderboardEntry = (DsDataset.Tables(0).Rows(0).Item(StrNameSearched).ToString)
    

    如果没有找到记录,那么Rows 将为空,因此这将导致错误,因为代码假定 Rows 永远为空。这个假设是不正确的,所以改变这个假设。例如:

    If DsDataset.Tables(0).Rows.Count > 0 Then
        StrLeaderboardEntry = (DsDataset.Tables(0).Rows(0).Item(StrNameSearched).ToString)
    Else
        ' No records were found.  Notify the user in some way.
    End If
    

    这找到了另一个很好的异常示例。如果查询成功,那么我至少希望Tables 总是有一个元素,所以这个假设更安全,如果它是错误的,那么确实会发生一些意想不到的事情(异常)。但是Rows 在搜索的正常条件下肯定是空的,所以代码应该期待并处理它。

    作为一般建议,切勿将Try/Catch 用于可以通过If/Else 处理的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 2012-05-03
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多