这可能听起来像一个奇怪的问题,但我不明白......
假设我有一个应用程序连接到服务器来做一些事情。这种连接可能会失败并抛出一个我可以捕获的异常。
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
语句中移动以下所有代码?编写这种行为的干净方法是什么?
答案 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