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

很难根据您发布的唯一代码提出建议,但至少,我会做这样的事情:

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 回答
1

对象应该是自治的。他们应该拥有正确行动所需的所有信息,以及执行行动所需的对象的引用。

CRC:小C姐姐R的责任感C

对象应该被告知要做什么,而不是被一些外部对象查询和修改以使它们进入某种正确的状态。他们负责执行该操作。如果他们无法执行操作,由于某种原因他们无法解决,他们应该抛出异常(或至少以某种方式报告错误)。

您的发布者仅应在无法发布数据时抛出异常。不要像查询一样使用该异常:“哦,它已断开连接,需要告诉它重新连接。”

如果它不能解决连接问题,那么它真的可以抛出 a PublishingException,而不是 a ServerDownor SessionException

然后,您的代码将不得不处理当您无法发布数据时要执行的操作。也许尝试以不同的方式发布,也许向管理员发送电子邮件。但不要尝试重新连接,您已经知道发布无法正常工作。

你可以再打电话publishData试试。这就像一个政策:当出版不起作用时我们该怎么办?该策略的正确位置将取决于您的设计。

可以满足您配置它的Publisher策略,例如尝试重新连接多少次,是否在连接成功之前保留缓存等。但是所有这些责任都属于发布者,如果它只会抛出异常无法实现它。

于 2013-02-21T10:33:15.667 回答