5

这听起来像是一个奇怪的问题,但我不明白......

假设我有一个应用程序连接到服务器来做一些事情。此连接可能会失败并引发我可以捕获的异常。

try {
  Client.connect();
} catch (System.Exception ex) {
  // Do some exception handling...
} finally {
  // Do some cleanup...
}

但是,如果连接成功,应用程序将继续...

try {
  Client.connect();
} catch (System.Exception ex) {
  // Do some exception handling...
} finally {
  // Do some cleanup...
}

// Talk to the server...

然而,无论如何都会执行“服务器通话”。是否发生异常并不重要。

如何确保仅在连接成功时才执行“服务器通话”?我是否必须在try语句中移动以下所有代码?对这种行为进行编程的干净方法是什么?

4

5 回答 5

13

“与服务器对话”应该发生在try区块中,紧随其后

Client.connect();
于 2012-06-06T20:52:37.993 回答
2

最简单的方法是设置一个布尔值。但是有很多很多方法可以解决这个问题。

bool connectionError = false;

try {
    // connect
} catch (...) {
    connectionError = true;
} finally {
   // whatever
}

if (!connectionError) {
    // talk to server.
}
于 2012-06-06T20:54:18.440 回答
2

有另一个变量 likeclientConnected并将其设置为 true 之后Client.Connect()clientConnected然后在与服务器交谈之前在try-catch 之外进行检查。

避免在一次尝试中做所有事情。您应该对可能引发异常的不同操作使用单独的 try-catch 块,并尽可能多地捕获特定异常。

于 2012-06-06T20:55:55.497 回答
0

通常,您对那些您希望抛出异常的语句使用 try...catch 语句。Try...Catch 定义了它自己的范围,因此您应该在 Try...Catch 块之外声明任何变量(至少,那些您想在它之外使用的变量)。

如果您想知道是否引发了异常,请在 Try...Catch 上方定义 Exception 变量。然后,您可以检查它以确定它是否为 Null。

System.Exception ex;
try {
  Client.connect();
} catch (ex) {
  // Do some exception handling...
} finally {
  // Do some cleanup...
}

if (ex != null){ ... }

// Talk to the server...  

您可以记录一个事件,然后调用一些代码重试或取消......或任何您需要做的事情。

于 2012-06-06T20:57:15.367 回答
0

使用某种类型的标志变量来指示服务器是否已连接。如果您的方法返回一个布尔变量,那么也可以。

int flag=0;
while(flag==0){
   try {
       Client.connect();
       flag=1;
   } catch (System.Exception ex) {
   // Do some exception handling...
   } finally {
      // Do some cleanup...
   }
}

//If server connects code
于 2012-06-06T20:58:26.530 回答