异常处理问题

时间:2013-02-21 09:51:00

标签: c++ exception architecture exception-handling

我有一个与服务器通信的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
}

我的问题是,是否可以嵌套试试这样的捕捉?否则这只是糟糕的设计?如果是这样,那么实现这一目标的最佳方式是什么?

PS:我的代码是用C ++编写的,但我想这个问题很普遍。 谢谢。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

对象应该是自治的。他们应该拥有正确行动所需的所有信息,并提供他们执行行动所需的对象。

CRCC lass R责任C ollaboration。

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

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

如果它无法解决连接问题,那么它真的可以抛出PublishingException,而不是ServerDownSessionException

然后,您的代码必须处理无法发布数据时要执行的操作。也许尝试以不同的方式发布,也许发送电子邮件给管理员。但是不要试图重新连接,你已经知道发布不起作用了。

您可以尝试再次拨打publishData。这就像一个政策:当出版不起作用时,我们该怎么做?该政策的正确位置取决于您的设计。

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