2008-09-23 94 views
1

我有一種方法,定期(例如每10秒一次)嘗試連接到服務器,並從中讀取一些數據。服務器可能一直不可用。如果服務器不可用,則該方法會引發異常。延遲例外

實現一個包裝器方法的最佳方式是什麼?除非服務器至少一分鐘不可用,否則不會引發異常?

回答

7

記錄上次成功到達服務器的時間。如果服務器引發異常,請抓住它並與上次到達服務器的時間進行比較。如果該時間超過一分鐘,請重新拋出異常。

+0

服務器實際上並沒有拋出異常,它是拋出的客戶端代碼;)但是,我仍然爲您的答案投了+1。 – 2008-09-23 21:07:39

1

您必須記錄最初嘗試連接到服務器的時間,然後捕獲異常。如果捕獲異常的時間大於原始時間+ 1分鐘,則重新拋出異常。如果不是,請重試。

+0

我完成了狙擊。 – brian 2008-09-23 21:07:00

1

理想情況下,您可以在對服務器的調用中設置超時。如果沒有在catch塊中執行thread.sleep(600)並再次嘗試,並且如果第二個沒有返回則失敗。

+0

超時彈出我的腦海。 – marcospereira 2008-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的異常處理系統,則可能不適合使用異常。

您可以跟蹤的錯誤條件的常用方法:保持狀態變量,根據需要用成功/失敗信息更新,並適當地作爲狀態的變化。