トップ回答者
VS2008デバッグ時におけるFaultExceptionの取扱い

質問
-
VS2008WCFの例外処理で2日ほど煮詰まってます。
以下の現象の回避策 知っている方いましたらご教授いただきたいです。
よろしくお願いします
■環境
VisualStudio2008 sp1WCFサービスライブラリをWcfSvcHost.exeでホスト(net.tcp)
同ソリューションにWPFアプリケーションをWCFクライアントとして実装
■現象・サーバー側でFaultExceptionをスローすると以下のメッセージが表示され
一時デバッグ(処理?)が中断する
”FaultExceptionはユーザー コードによってハンドルされませんでした。”・F5で実行を再開する
・クライアントのtry{}catch{}で例外をキャッチし、期待通りの動作をする
■やりたいこと
・サーバー側でFaultExceptionをスローするたびにデバッグを中断したくない
#クライアント側のtry{}catch{}で直接、例外をキャッチしたい※これが普通なんでしょうか?
■参考までに
サーバー側App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfServiceLibrary1.Service1" behaviorConfiguration="WcfServiceLibrary1.Service1Behavior">
<host>
<baseAddresses>
<add baseAddress = "net.tcp://localhost:8731/WcfServiceLibrary1/Service1/" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<endpoint address ="" binding="netTcpBinding" contract="WcfServiceLibrary1.IService1">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfServiceLibrary1.Service1Behavior">
<serviceMetadata httpGetEnabled="False"/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
回答
-
あっし さんからの引用 ・サーバー側でFaultExceptionをスローするたびにデバッグを中断したくない
スローしているプロシージャをデバッグ対象から外すとか。
http://msdn.microsoft.com/ja-jp/library/system.diagnostics.debuggerstepthroughattribute(VS.85).aspx
あとはホストアプリケーションをVSではなく実際に起動するしかないかな。
あっし さんからの引用 ”FaultExceptionはユーザー コードによってハンドルされませんでした。”
・F5で実行を再開する
・クライアントのtry{}catch{}で例外をキャッチし、期待通りの動作をする
※これが普通なんでしょうか?
ですね。
WCFランタイム(ServiceHostクラス以下)がキャッチしてクライアントへメッセージングしてるってことですね。
サービスとクライアントは同一プロセスではありませんので書かれた挙動は避けられないでしょう。
逆にその他のユーザーコードがキャッチしてしまうとクライアントに通知される処理は走らないと思います。
すべての返信
-
あっし さんからの引用 ・サーバー側でFaultExceptionをスローするたびにデバッグを中断したくない
スローしているプロシージャをデバッグ対象から外すとか。
http://msdn.microsoft.com/ja-jp/library/system.diagnostics.debuggerstepthroughattribute(VS.85).aspx
あとはホストアプリケーションをVSではなく実際に起動するしかないかな。
あっし さんからの引用 ”FaultExceptionはユーザー コードによってハンドルされませんでした。”
・F5で実行を再開する
・クライアントのtry{}catch{}で例外をキャッチし、期待通りの動作をする
※これが普通なんでしょうか?
ですね。
WCFランタイム(ServiceHostクラス以下)がキャッチしてクライアントへメッセージングしてるってことですね。
サービスとクライアントは同一プロセスではありませんので書かれた挙動は避けられないでしょう。
逆にその他のユーザーコードがキャッチしてしまうとクライアントに通知される処理は走らないと思います。
-
まどかさん、返信いただきありがとうございます。
まどか さんからの引用 スローしているプロシージャをデバッグ対象から外すとか。
http://msdn.microsoft.com/ja-jp/library/system.diagnostics.debuggerstepthroughattribute(VS.85).aspx
[DebuggerStepThroughAttribute]の存在は知りませんでした。
例外をスローしているすべてのクラスに属性を付加すると
デバッグができないし、書くのも手間という理由で、現実的ではないのかなと・・・
まどか さんからの引用 あっし さんからの引用 ”FaultExceptionはユーザー コードによってハンドルされませんでした。”
・F5で実行を再開する
・クライアントのtry{}catch{}で例外をキャッチし、期待通りの動作をする
※これが普通なんでしょうか?
ですね。
WCFランタイム(ServiceHostクラス以下)がキャッチしてクライアントへメッセージングしてるってことですね。
サービスとクライアントは同一プロセスではありませんので書かれた挙動は避けられないでしょう。
逆にその他のユーザーコードがキャッチしてしまうとクライアントに通知される処理は走らないと思います。
そうですね。
改めて言われるとそのとおりだと思います。
FaultException以外で、ホストからクライアントにエラーを通知する方法が他にないものか
#ないでしょうけど・・・
もう少し探してみます。