UI 側で WCF 例外をキャッチする最善の方法を見つけようとしています。
最初に、サービス メソッドを呼び出すときにまだusing
ブロックを使用していると言わざるを得ません。これは、クライアント プロキシがすべて次のIDisposable.Dispose
ようにメソッドを実装しているためです。
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
try
{
if (State != CommunicationState.Faulted)
{
Close();
}
}
finally
{
if (State != CommunicationState.Closed)
{
Abort();
}
}
}
}
これによりusing
、クライアント コードでブロックを使用できるようになります。これは、ブロックの使用の最後で、Dispose メソッドが破棄時に通信チャネルの状態をチェックし、障害状態の場合はチャネルを中止するためです。
UI側で例外をキャッチすることに関する多くの記事を読みましたが、実際、私のコードは次のようになります:
using (var myClientProxy = new MyClientProxy())
{
try
{
myClientProxy.DoSomething();
}
catch (TimeoutException timeoutException)
{
MessageBox.Show(
timeoutException.Message,
"Timeout expired",
MessageBoxButtons.OK,
MesssageBoxIcon.Error);
}
catch (FaultException<ServiceErrorDetails> faultException)
{
MessageBox.Show(
faultException.Detail.Message,
"A service exception occured",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (CommunicationException communicationException)
{
MessageBox.Show(
communicationException.Message,
"Communication problem",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (Exception exception)
{
MessageBox.Show(
exception.Message,
"An exception occured",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
ご覧のとおり、これは非常に冗長であり、UI から複数の WCF 呼び出しがあるため、これは非常に大きなコードの臭いになる可能性があります。
単一のcatch ブロックでサービス呼び出しで問題が発生する可能性があるものをすべてキャッチし、ユーザーにメッセージ ボックスを表示できるようにしたいと考えています。
それは良い習慣ですか?なぜなら、コードを 1 つの try/catch ブロックに減らしたとしても、それはまだコードの臭いではないでしょうか?
どうすればそれをうまく処理できますか?