2

我逐步浏览了这段代码,发现该函数不仅从未被调用,而且 myBase.Load 的其余部分也从未完成这里发生的事情。

现在显示所有外部参考。程序永远不会碰到 ** 中的行,并且确实将 frmMain_Load 作为第一项运行。stepthrough 图标确实落在以 reader= 开头的行上,但从不调用 runAsIsQuery (断点不会捕获并且 stepthrough 会消失)。然后它向我显示 frmMain 而不处理来自 frmMain_Load 或 runAsISQuery 的任何其他代码

Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    sqlstring = "SELECT Nickname FROM tblBikeInfo"
    reader = sql.runAsIsQuery(cnn, sqlstring) 'never fires
    **If 1 = 1 Then**
        'ummmm never comes back here either
    End If

询问有关其他参考的额外详细信息,这些参考在 frmMain 作为全局变量

Dim reader As OleDbDataReader
Dim sql As OLEDB_Handling  'custom  class
Public cnn = MotorcyleDB.GetConnection

自定义类的函数 (OLEDB_Handling)

**Public Function runAsIsQuery(connection As OleDbConnection, SQL As String) As OleDbDataReader**
    Dim reader As OleDbDataReader
    Dim command As New OleDbCommand(SQL)
    command.Connection = connection
    Try
        connection.Open()
        reader = command.ExecuteReader()
        Return reader

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

End Function

连接字符串类调用(MotorcyleDB)

Public Shared Function GetConnection() As OleDbConnection

    Return New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\************\Documents\Visual Studio 2010\Projects\MotorcycleMinder\MotorcycleMinder\MotorcycleServiceLog11.accdb")
End Function
4

1 回答 1

2

我发现了这个: http ://blog.adamjcooper.com/2011/05/why-is-my-exception-being-swallowed-in.html

这是该网站的一个片段。

如果满足这些条件:

  1. 您在 64 位版本的 Windows 上运行(您的应用程序是为 32 位还是 64 位构建的并不重要;只有操作系统的位深度)
  2. 您正在构建一个 WinForms 应用程序
  3. 您正在使用 Visual Studio 调试应用程序(使用异常捕获的默认选项)
  4. 您的主窗体有一个 Load 事件处理程序
  5. 在您的 Load 处理程序执行期间,发生异常

然后:

异常将被系统静默吞下,当您的处理程序不会继续执行时,您的应用程序将继续运行。如果您将处理程序代码包装在 try/catch 块中,您仍然可以显式捕获任何抛出的异常。但如果你不这样做,你永远不会知道出了什么问题。

请注意,必须满足所有条件。例如,如果您在没有调试的情况下运行应用程序,那么仍然会正确抛出未处理的异常。

网站上还有一个解决方法。但我会将代码放在 try catch 块中,或者将整个代码放在 Initializer/Constructor 中。

于 2013-04-30T10:45:27.833 回答