在try-catch-finally之后继续

时间:2012-06-06 20:50:07

标签: c# .net exception-handling

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

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

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语句中移动以下所有代码?编写这种行为的干净方法是什么?

5 个答案:

答案 0 :(得分:13)

“与服务器通话”应该在try块中,紧跟在

之后
Client.connect();

答案 1 :(得分:2)

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

bool connectionError = false;

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

if (!connectionError) {
    // talk to server.
}

答案 2 :(得分:2)

有另一个变量,例如clientConnected,并在Client.Connect()之后立即设置为true。然后在与clientConnected进行try-catch检查之前,然后与服务器通信。

避免在单个try-catch中执行所有操作。您应该对可能引发异常的不同操作使用单独的try-catch块,并尽可能地捕获特定的异常。

答案 3 :(得分:0)

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

如果您想知道是否抛出了异常,那么在Try ... Catch上面定义Exception变量。然后,您可以检查它以确定它是否为空。

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

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

// Talk to the server...  

你可以记录一个事件,然后调用一些代码再试一次或取消......或者你需要做什么。

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