6

重複の可能性:
VS2010は、64ビットバージョンのWindowsのWinFormsアプリケーションで未処理の例外メッセージを表示しません

VS2012をインストールして使い始めました。以前はVS2008Expressを使用していました。VS2012はWin764ビットで実行されています。(以前の開発環境はXP 32ビットでした)。

これまでのところ、基礎研究プロジェクト(WinForms、VB)を使用しており、VSが未処理の例外を無視していることがわかりました。この最後の行で例外が発生するはずです。

With cmd 
 .Connection = sqlConn
 .CommandType = CommandType.StoredProcedure
 .CommandText = "NameOfStoredProcedure"
 .Parameters.Add("@TheParameterName", SqlDbType.Int, -1)
 .Parameters("@TheParameterNameWithATypo").Direction = ParameterDirection.ReturnValue

案の定、イミディエイトウィンドウには次のように表示されます。

A first chance exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll

しかし、コードは実行を続けます!

[デバッグ/例外]ダイアログには、すべての種類の例外に対して[スロー]および[ユーザー未処理]チェックボックスがあります。「User-Unhandled」がすべてチェックされています。例外を処理し、処理された例外を中断したくないので、「スロー」にチェックマークを付けたくありません。(現在、Try ... Catchブロックはまったくありませんが、デバッガーはプロジェクト全体が1つに含まれているように動作しています)。

すべてのオプションなどを調べましたが、魔法の「例外の中断をオンにする」オプションが見つかりません。私が助けを求めているのは私のコードではありません-これが起こっていると、必然的に犯す愚かな間違いをデバッガーが検出することを信頼できなくなります。

誰かがこれに遭遇した別の質問を見つけました、そしてそこでの問題はWin64にあるようでした。しかし、VSはWin64では本当に使用できませんか?私はそれを完全に信じることはできませんが、未処理の例外を壊さないと、事実上使用できなくなります。

編集: すべてのコメントをありがとう。Neoliskのソリューションを試しましたが、2つのハンドラーの署名が異なるため、コードを少し変更する必要がありました。

Public Sub Main()
    AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
    AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler

    Form1.Show()
End Sub

Friend Sub ThreadExceptionHandler(sender As Object, e As System.Threading.ThreadExceptionEventArgs)

End Sub

Friend Sub UnhandledExceptionhandler(sender As Object, E As System.UnhandledExceptionEventArgs)
End Sub

これはうまくいきました-ありがとう!ただし、アプリケーションフレームワークを無効にする必要がありました(そうしないと、アプリはサブメインをスタートアップとして使用できません)。そしてTBH私は.NETの初心者であり、その効果/長所/短所が何であるかを確実に知ることさえできません。私はあなたがすべて提供したリンクを読み、何が起こっているのかを理解しましたが、私がそれを避けることができれば関与したくありません...

幸い、KB976038の修正プログラムを適用することでうまくいきました。Form_Loadイベントを実行して、デバッグモードで例外と実行の中断を引き起こすはずのコードが、期待どおりにこれを実行するようになりました。これは、Application Frameworkが有効になっていて、Form1がスタートアップオブジェクトであり、上記のコードがコメントアウトされている場合です。

EDIT2: いいえ、その修正プログラムは機能しません。元の「不正なパラメータ名」の行が原因で、例外が発生してコードが停止しました。しかし、DBNull-> Int32変換例外のある後続の行で、このエラーボックスが発生しました(デバッグの可能性はありません)。

vshost.exe-アプリケーションエラー内部エラー:Debugger::HandleIPCEventで未処理の例外。イベントID=0x246例外コード=0x0000005、Eip=0x70d58101。プロセスID=0xbec(3052)、スレッドID = 0xb1c(2844)。

すべてのコメントに本当に感謝していますが、私の考えでは、これは大きな問題です。例外がデバッグ可能であると信頼できない場合、開発者はVSをどのように使用できますか?サブメインから始めて、何かを開発するたびにそれらの特別な行を入れることを覚えておく必要はありません。または、Form_Loadでコードを使用できないことを覚えていますか?Win764ビットを開発OSとして使用するのをやめることをお勧めします。

4

1 に答える 1

3

Form_Loadそれが説明するように、あなたのコードは にあると思います。この場合、私の質問を見てください: Visual Studio 2010 以降、WinForms および WPF の重大なバグを説明してください。これは既知の問題です。C# で既に見つけた 3 つの魔法の行からコードを配置するかForm_Load、アプリケーションを開始して配置する必要があります。Sub MainVB.NET の同じ 3 行を次に示します。

AddHandler Application.ThreadException, AddressOf YourExceptionHandler
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf YourExceptionHandler

私が覚えている限りでは、最初の行は実際にこの問題を修正しており、残りの 2 行は他の不可解なエラーをカバーするためのものです。安全のために、プログラムの最初にすべてを常に含めても問題はありません。YourExceptionHandler空のメソッドにすることができます。これらの 3 行を追加すると、例外のキャッチが期待どおりに機能し始めるはずです。

于 2012-11-15T20:13:53.023 に答える