1

サーバーと通信する C++ アプリケーションがあります。一部のデータをサーバーに発行します。サーバー障害の例外を処理しているときに、この懸念が生じました。サーバーに問題が発生したときに接続によってスローされた例外を処理し、サーバーへの再接続を試みる必要があります。関連する疑似コードを以下に投稿しました。

try {
    publisher->publishData(data);
} catch (const ServerDownException& ex) {
    //handle error, reconnect and create a new session
}

私が懸念しているのは、この例外を処理するときに、再接続してセッションを再度作成する必要があることです。セッションを再度作成するためのコードは、例外をスローする可能性があります。したがって、エラー処理コードには、次のように、元の catch ブロック内に try - catch ブロックが再び含まれます。

try {
    publisher->publishData(data);
} catch (const ServerDownException& ex) {
    publisher->initialize();
    publisher->openSocket();
    try {
        publisher->createSession();
    } catch (const SessionException& tx) {
        //session creation error
    }
    publisher->publishData(data);//after re-connecting, publish data again
}

私の質問は、このようにネストされた try - catch を使用しても大丈夫ですか? そうでなければ、これは単なる悪い設計ですか?もしそうなら、これを達成するための最良の方法は何ですか?

PS .: 私のコードは C++ ですが、質問は一般的なものだと思います。ありがとうございました。

4

2 に答える 2

1

オブジェクトは自律的である必要があります。正しく行動するために必要なすべての情報と、行動を実行するために必要なオブジェクトへの参照が必要です。

CRCClassesponsibilityollaboration 。R_C

オブジェクトは、正しい状態にするために外部オブジェクトによって照会および変更されるのではなく、何をすべきかを指示する必要があります。彼らは行動を実行する責任があります。アクションを実行できない場合、何らかの理由で解決できない場合は、例外をスローする必要があります(または少なくとも何らかの方法でエラーを報告する必要があります)。

パブリッシャーは、データを公開できない場合にのみ例外をスローする必要があります。その例外をクエリのように使用しないでください。「接続が切断されているので、再接続するように指示する必要があります。」

接続の問題を解決できない場合は、またはをスローするのPublishingExceptionではなく、本当にをスローする可能性があります。ServerDownSessionException

その場合、データを公開できない場合の処理​​をコードで処理する必要があります。おそらく、別の方法で公開してみてください。管理者にメールを送信してみてください。ただし、再接続しようとしないでください。公開が機能していないことはすでにわかっています。

もう一度電話してみてくださいpublishData。それはポリシーのようなものです。公開が機能しない場合はどうすればよいでしょうか。そのポリシーの正しい場所は、設計によって異なります。

Publisher、再接続を試行する回数、接続が成功するまでキャッシュを保持するかどうかなど、構成したポリシーを満たすことができます。ただし、その責任はすべてパブリッシャーにあり、例外がスローされる場合のみです。それを実現することができませんでした。

于 2013-02-21T10:33:15.667 に答える
1

あなたが投稿した唯一のコードに基づいて提案するのは難しいですが、少なくとも、私は次のようにします:

while(true){
  try {
      publisher->publishData(data);
      break;
  } catch (const ServerDownException& ex) {
    reconnect(publisher);
  }
}

再接続が構成されている場所

publisher->initialize();
publisher->openSocket();
try {
   publisher->createSession();
} catch (const SessionException& tx) {
  //session creation error
}
于 2013-02-21T10:12:55.120 に答える