奇妙な問題がありました。私が取り組んでいる複雑なカメラ制御プログラムでは、他の人がプログラミングしたC#ラッパーを使用してSDKを使用します。ラッパーを同じソリューション内の別のプロジェクトとして組み込みます。自分のコードは、SDKへの多数の呼び出しを使用するWPFプロジェクトです。C#同じソリューション内の別のプロジェクトから例外をキャッチできません。
すべての同期が正常に動作します。ただし、カメラの応答に応じて、SDKは非同期応答を送信することがあります。通常、カメラが報告するエラーに関する情報を含むカスタム例外をスローします。私はしかし、例外がこれまでにキャッチされなかっます
try { ... } catch (ThisExceptionType) { ... }
を使用して、これを実装しました。例外状況が発生すると、VisualStudioがブレークし、SDKがスローしたコードが表示され、「ThisExceptionTypeはユーザーコードによって未処理です」というレポートが表示され、例外条件の詳細が表示されます(正しくスローされたことを意味します)。例外が私が作成したエラー条件に対応することを確認したので、私のコードの間違った部分を見ていないと確信しています。テスト目的のために
は、私はまた、このようなthrow new ArgumentException("Test");
同じ結果として、それは標準の例外を除いてThisExceptionType
をスローSDKで行を置き換え:catch (ArgumentException)
に私のキャッチを変更するとき、私はまだ条件をキャッチし、同様のunhandled-を取得することはできませんユーザコード別エラー。ここで
はSDKが例外をスローする方法は次のとおりです。
void CallEntryPoint(...)
{
eNkMAIDResult result = _md3.EntryPoint(...);
switch (result)
{
// Note: Ignore these return values
case eNkMAIDResult.kNkMAIDResult_NoError:
case eNkMAIDResult.kNkMAIDResult_Pending:
break;
default:
throw new NikonException(...);
}
}
は、私はここで何をしないのですか?申し訳ありませんが、これは単純な問題です。私は一般的なプログラミングではかなり経験がありますが、VisualStudioではあまり働かず、C#でも大したことではありません。
UPDATEは:(これは実際にThomas Dideriksen's Nikon SDK wrapperある)ラッパーの作成者によると、「あなたは、WPFやWinFormsのアプリケーションを書いているとき、C#のラッパーは、UIスレッド上のイベントを発生する固有のWindowsメッセージキューに依存しています。」
また、ラッパーはすべてのカメラタスクを順番に処理するので、私のステートメントは非同期例外をスローするラッパーについて間違っていたとも言われています - ラッパーのすべてのコード例は同じtry { ... } catch (ThisExceptionType) { ... }
アプローチを使用します。良い対策のために、ハンドラをAppDomain.CurrentDomain.UnhandledException
にフックするなど、いくつかの提案を試みましたが、そのアプローチでも例外をキャッチできませんでした。
これがなぜ起こっているのでしょうか?
問題は非同期処理です。他のスレッドからの例外は、メインスレッド内で捕捉されません。 [this](http://stackoverflow.com/questions/5983779/catch-exception-that-is-thrown-in-different-thread)のようなこのトピックに関する多くの投稿があります –
私はあなたが非同期メッセージングを処理すると思いますイベント経由で。あなたはコードを投稿できますか? –
"SDKはときどき*非同期*応答を送信します":tryとcatchの間に実際に例外がスローされないように見えます。 SDKと対話するコードを含めることはできますか?私は、あなたのコードは、SDKをオフにし、そのことを行う何かを行う必要があり、最終的に例外をスローすると仮定します。 'Task' /' async'を使用するSDKの最新コードでは、 '' await'の周りにtry/catchを投げることができるはずです(http://stackoverflow.com/a/19865613/424129)。 –