2

このコードをステップ実行すると、関数が呼び出されないだけでなく、myBase.Load の残りの部分がここで行われていることを完了していないことがわかります。

すべての外部参照が表示されるようになりました。プログラムは ** で囲まれた行にはヒットせず、最初の項目として frmMain_Load を実行します。ステップスルー アイコンは、reader= で始まる行に表示されますが、runAsIsQuery を呼び出すことはありません (ブレークポイントはキャッチされず、ステップスルーは単に蒸発します)。次に、frmMain_LoadまたはrunAsISQueryからの他のコードを処理せずにfrmMainを表示します

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 ビット用にビルドされているかどうかは問題ではなく、OS のビット深度のみ)
  2. WinForms アプリを構築しています
  3. Visual Studio でアプリケーションをデバッグしている (例外キャッチのデフォルト オプションを使用)
  4. メイン フォームに Load イベント ハンドラがある
  5. Load ハンドラの実行中に例外が発生します

それで:

例外はシステムによって暗黙のうちに飲み込まれ、ハンドラーが実行を継続しなくても、アプリケーションは実行を続けます。ハンドラー コードを try/catch ブロックでラップすると、スローされた例外を明示的にキャッチできます。しかし、そうしなければ、何かがうまくいかなかったことを知ることはできません。

すべての条件を満たす必要があることに注意してください。たとえば、デバッグせずにアプリケーションを実行すると、未処理の例外が正しくスローされます。

サイトにも回避策があります。しかし、コードを try catch ブロックに入れるか、全体をイニシャライザー/コンストラクターに入れます。

于 2013-04-30T10:45:27.833 に答える