延迟例外


1

我有一种方法,定期(例如每10秒一次)尝试连接到服务器,并从中读取一些数据。服务器可能一直不可用。如果服务器不可用,则该方法会引发异常。

实现一个包装器方法的最佳方式是什么?除非服务器至少一分钟不可用,否则不会引发异常?

7

记录上次成功到达服务器的时间。如果服务器引发异常,请抓住它并与上次到达服务器的时间进行比较。如果该时间超过一分钟,请重新抛出异常。

  0

服务器实际上并没有抛出异常,它是抛出的客户端代码;)但是,我仍然为您的答案投了+1。 23 9月. 082008-09-23 21:07:39


1

您必须记录最初尝试连接到服务器的时间,然后捕获异常。如果捕获异常的时间大于原始时间+ 1分钟,则重新抛出异常。如果不是,请重试。

  0

我完成了狙击。 23 9月. 082008-09-23 21:07:00


1

理想情况下,您可以在对服务器的调用中设置超时。如果没有在catch块中执行thread.sleep(600)并再次尝试,并且如果第二个没有返回则失败。

  0

超时弹出我的脑海。 24 9月. 082008-09-24 03:38:02


3

伪代码。

//Create Timer 
//Start Timer 
bool connected = false; 

while (!connected) 

    try { 
     //Connect To DB 

     connected = true; 
    } 
    catch (Exception ex) { 
     if (more than 1 minute has passed) 
      throw new Exception(ex); 
    } 

} 

0

你可以有一个重试次数,如果(在你的案件6)所需的数量已经满足,然后抛出一个异常

int count = 0; 

CheckServer(count); 

public void CheckServer(count) { 
try 
{ 
    // connect to server 
} 
catch(Exception e) 
{ 
if(count < MAX_ATTEMPTS) { 
    // wait 10 seconds 
    CheckServer(count++) 
    } 
    else { 
    throw e; 
    } 
} 
} 

0

你可以设置一个boolean变量是否不服务器连接成功,并检查它在异常处理程序,就像这样:

class ServerTester : public Object 
{ 
    private bool failing; 
    private ServerConnection serverConnection; 
    private Time firstFailure; 

    public ServerTester(): failing(false) 
    { 
    } 

    public void TestServer() throws ServerException 
    { 
    try 
    { 
     serverConnection.Connect(); 
     failing = false; 
    } 
    catch (ServerException e) 
    { 
     if (failing) 
     { 
     if (Time::GetTime() - firstFailure > 60) 
     { 
      failing = false; 
      throw e; 
     } 
     } 
     else 
     { 
     firstFailure = Time::GetTime(); 
     failing = true; 
     } 
    } 
    } 
} 

我不知道实际时间的API是什么,因为它已经有一段时间,因为我最后一次使用的Java。这会做你的问题,但有关它似乎并不正确。对异常进行轮询会让我觉得有些倒退,但是由于你在处理服务器,所以我想不出任何其他方式。


1

记住,异常处理仅仅是一个通常的“回报”系统非常专业的使用。 (有关更多技术细节,请参阅“monad”。)如果您想要发送的异常情况不适合Java的异常处理系统,则可能不适合使用异常。

您可以跟踪的错误条件的常用方法:保持状态变量,根据需要用成功/失败信息更新,并适当地作为状态的变化。