Webサービスコール時に生じたエラーの処理

SilverlightアプリケーションでWebサービスコール中にエラーが起きた場合、AsyncCompletedEventArgsのErrorプロパティにExceptionがセットされます。Errorの内容によって応じた適切な処理を行う必要があります。

アジェンダ

  • エラー時のResultプロパティの挙動
  • ErrorプロパティにセットされるExceptionの種類
  • Errorプロパティの処理

エラー時のResultプロパティの挙動

Errorプロパティに値がセットされている時に、Resultプロパティにアクセスすると、例外が発生します。

そのため、Errorプロパティに値がセットされているときは処理を分岐させることが必須です。

ErrorプロパティにセットされるExceptionの種類

Errorプロパティには、だいたい下記のようなExceptionがセットされるはずです。

Exceptionの種類 発生理由
CommunicationException サーバが落ちている、LANケーブルが抜けているなどの理由でサーバが見つからなかったとき
TimeoutException サーバへのアクセスは成功したが、サーバからタイムアウト設定時間以内に返答がなかったとき
Exception サーバ内で処理されないExcpetionが発生したなどの不測の事態が起きたとき

Errorプロパティの処理

Exceptionの種類に応じたメッセージを表示する処理をWebサービスのコンプリートメソッドに記述します。

private void Client_GetMessageCompleted(object sender, GetMessageCompletedEventArgs e)
{
    Exception error = e.Error;
    if (error == null)
    {
        // 正常処理
        string result = e.Result;
        TblResult.Text = result;
    }
    else if (error is CommunicationException)
    {
        string errorMessage =
            "サーバーとの通信中に問題が発生しました。"
            + Environment.NewLine
            + "しばらく待ったのち再度実行してください。";

        MessageBox.Show(errorMessage, "通信障害", MessageBoxButton.OK);
    }
    else if (error is TimeoutException)
    {
        string errorMessage =
            "通信がタイムアウトしました。"
            + Environment.NewLine
            + "しばらく待ったのち再度実行してください。";

        MessageBox.Show(errorMessage, "通信障害", MessageBoxButton.OK);
    }
    else
    {
        string errorMessage =
            "サーバーとの通信が失敗しました。"
            + Environment.NewLine
            + "システム管理者に連絡してください。";

        MessageBox.Show(errorMessage, "通信障害", MessageBoxButton.OK);
    }
}

これでError発生時にユーザは何が起きたのか把握することができると思います。
今回の処理はあくまで例ですが、必ずErrorの処理は行うようにしましょう。