2012-11-15 8 views
6

Possible Duplicate:
VS2010 does not show unhandled exception message in a WinForms Application on a 64-bit version of WindowsVS 2012(VB.net)は、64ビット

私がインストールしたWindows 7で未処理の例外を無視し、VS2012を使用して開始されます。以前はVS2008 Expressを使用していました。 VS2012はWin 7 64ビット版で動作しています。 (以前の開発環境はXP 32ビット版でした)。

基本的なリサーチプロジェクト(WinForms、VB)を使ってこれまでのところ、処理されていない例外をVSが無視していることがわかりました。このの最後の行が例外が発生する必要があります

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

をしかし、コードが実行されているだけに運ぶ:十分

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

確かに、イミディエイトウィンドウを示しています!

[デバッグ/例外]ダイアログでは、すべての例外タイプに対して[スロー]と[ユーザー未処理]のチェックボックスがあります。 「User-Unhandled」にはすべてがチェックされています。私は例外を処理し、処理された例外を壊さないために "Thrown"にチェックを入れたくありません。 (今は、私は試してみません...ブロックをまったくキャッチ - しかし、デバッガは、プロジェクト全体が1つに含まれているかのように動作しています)。

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

もう1人が見つかったところで、誰かがこの問題に遭遇し、Win64で問題が発生しているように見えたquestionが見つかりました。しかし、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 

これは働いていた - ありがとう!しかし、アプリケーションフレームワークを無効にする必要がありました(そうでなければ、アプリケーションはSub Mainを起動として使用できません)。そしてTBH私はあまりにも.NETの初心者でも、その効果/長所/短所が何であるかを知ることすらできません。私があなたが提供したすべてのリンクを読んで、何が起こっているのかを知りましたが、私がそれを避けることができれば関与したくない...

幸いにも、KB976038の修正プログラムを適用してくれました。デバッグモードで例外が発生し、実行が中断され、Form_Loadイベントを実行するコードでは、これが予期したとおりに行われます。これはApplication Frameworkを有効にし、Form1をスタートアップオブジェクトとして使用し、上のコードはコメントアウトします。

EDIT2: いいえ、その修正プログラムは機能しません。元の「悪いパラメータ名」行は、コードを例外で停止させました。しかし、ちょうどこのエラーボックス(なしデバッグ可能性)を引き起こしたDBNull->のInt32変換例外とそれに続くライン:

vshost.exe - Application Error INTERNAL ERROR: Unhandled exception in Debugger::HandleIPCEvent. Event ID=0x246 Exception code=0x0000005, Eip=0x70d58101. Process ID=0xbec (3052), Thread ID=0xb1c (2844).

は、私は本当にすべてのあなたのコメントに感謝 - しかし、私の心に、これは契約ブレーカです:どのように例外がデバッグ可能であると信頼できない場合、開発者はVSを使用できますか?Sub Mainで始めることを覚えておき、何かを開発するたびにこれらの特別な行を置く必要はありません。Form_Loadでコードを使用することはできません。私は、開発OSとしてWin7 64ビットの使用をやめることをお勧めします。

+0

私はVS 2012 on Win7 64bitを使用していますが、私の例外は正常です。ただし、ターゲットとする.Netフレームワークのバージョンを変更してみてください。最新のものを試してください。私は、デバッガが別のフレームワークをデバッグしてからプロジェクトが実行されている場合に、この問題が発生する可能性のあるインスタンスについて読んだことがあります。 – Kratz

+0

@ HansPassant:同じ原因、異なる開始条件。 OPはVS 2012を使用しています。 – Neolisk

+1

VS2012で修正されていません。 VS2021でも修正されません。うまくいけば、これ以上気にする必要はありません。 –

答えて

3

あなたのコードはであると思います。この場合、私の質問をここで見てください:Explain critical bug in Visual Studio 2010 and up, WinForms and WPF。これは既知の問題です。コードをから外したり、アプリケーションをSub Mainから開始して、C#ですでに見つかった3つの魔法の行を追加する必要があります。ここではVB.NETで同じ3行です:

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

は、私が覚えている限りでは、最初の行は、実際にこの問題を修正し、他の2は、他の神秘エラーをカバーしています。あなたのプログラムの始めに安全のために常にそれらをすべて含めることは傷つきません。 YourExceptionHandlerは空の方法です。これらの3行を追加すると、例外キャッチが期待どおりに動作するはずです。

+0

ありがとう!今私はこのような深みを掘り起こす必要はないと思っていました。私はこの少し異なるコードをモジュールのSub Mainに追加しなければならなかった: – sebt

関連する問題