我有一个与服务器通信的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 ++编写的,但我想这个问题很普遍。 谢谢。
答案 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)
对象应该是自治的。他们应该拥有正确行动所需的所有信息,并提供他们执行行动所需的对象。
CRC
:C
lass R
责任C
ollaboration。
对象应该被告知要做什么,而不是被某些外部对象查询和修改以使它们进入某种正确的状态。他们负责执行该行动。如果他们无法执行操作,由于某种原因他们无法解决,他们应该抛出异常(或者至少以某种方式报告错误)。
您的发布商只有在无法发布数据时才会抛出异常。不要像查询一样使用该异常:“哦,它已经断开连接,需要告诉它重新连接。”
如果它无法解决连接问题,那么它真的可以抛出PublishingException
,而不是ServerDown
或SessionException
。
然后,您的代码必须处理无法发布数据时要执行的操作。也许尝试以不同的方式发布,也许发送电子邮件给管理员。但是不要试图重新连接,你已经知道发布不起作用了。
您可以尝试再次拨打publishData
。这就像一个政策:当出版不起作用时,我们该怎么做?该政策的正确位置取决于您的设计。
Publisher
可以实现您配置的策略,例如尝试重新连接的次数,是否在连接成功之前保留缓存等等。但是,所有责任都属于发布者和如果它无法实现它,它只会抛出异常。