1

だから、私はこの状況を持っています:

解決

  • -プロジェクトA
    -Frma
  • -プロジェクトB
    -FrmB

私のメインアプリはプロジェクト A にあります。この FrmA フォーム内には、プロジェクト B 内にある try..catch 内で FrmB のメソッドを開始して呼び出すメソッドがあり、この FrmB は 2 番目の try..catch ブロック内でスローされます。例外を正常にキャッチしますが、それを frmA catch ブロックにスローしません。このようなもの:

フレーム:

try{
 frmB.show();
}catch(Exception ex){
  //Do things
}

FrmB_onLoad():

try{
 object.method(); //method which generates the Exception 
}catch(Exception ex){
  throw ex; //which should go to frmA method
}

さて、最も興味深いのは、Visual Studio のデバッグ モードまたはリリース モードでは問題なく動作することですが、本番環境に公開すると、frmA の try..catch でこの奇妙な非キャッチが発生します。

推測はありますか?

PS: 私は VS2005 を使用しています (ええ、私は知っています..)

4

3 に答える 3

2

Hans Passantは、このサイトの別の質問に答えて、この動作を非常によく説明しています。

つまり、モーダル ダイアログが起動すると、WinForms はメッセージ ポンプを作成するため、フレームワークはメッセージ ポンプにバブル アップするすべての例外をキャッチします。デバッガーで実行している場合、フレームワークは代わりにモーダル ダイアログから呼び出し元のコードに例外を渡すことを許可します。これにより、開発者は例外がキャッチされていないことに気付くと考えられます。

グローバルな未処理の例外ハンドラーを設定することが望ましくない場合 (そして、私が取り組んだアプリケーションでは望ましくありませんでした)、たとえば、代わりに Load イベント ハンドラーでスローされた例外をキャッチし、キャッチした例外を新しいパブリック プロパティに割り当てることができます。あなたのフォームに。そのダイアログのクライアントは、ShowDialog() が戻った後にその例外プロパティが設定されているかどうかを確認する必要があります。これは優れた解決策ではありません。フォームから出てくるすべての例外をキャッチするのは難しく、ダイアログが閉じられたときにクライアントがそのプロパティをチェックするのを忘れやすくなりますが、状況によってはうまくいく可能性があります。

于 2013-08-02T21:23:08.383 に答える
0

開発マシンで VS の外部で実行します。例外はキャッチされますか?
もしそうなら; 運用環境で間違った DLL を実行している可能性があります。デプロイ時に何かが発生します。
次に
、正しい DLL を手動で本番環境にコピーして、再試行してください。

HTH

于 2013-08-02T20:24:15.367 に答える