2011-12-20 33 views
0

我正在創建一個功能,將做一個套接字接受並返回3 vales 0 =真的很糟糕的錯誤發生退出線程 1 = ok與連接 =發生某事,做另一個接受(超時)。如果套接字接受導致異常,我怎麼才能找出原因?

我看到IOException有一個GetCause方法返回一個可拋出的對象。 這個可拋出的對象有一個get cause方法返回一個throwable,它有一個getcuase方法返回一個throwable,看起來像這樣會永遠持續下去,繼續得到另一個可拋出的對象。

我怎樣才能得到異常螞蟻關閉的原因????? 我可以使用得到的原因和一串字符串比較,但這似乎並不可靠。 特德

int GetClient() 
{ 
    try { 
     server.setSoTimeout(5*1); 
     connection=server.accept(); 
    } 
    catch(IOException ec) 
    { 
     System.out.println(Thread.currentThread()+":"+ec.getMessage()); 


     return 2; // for time out or something where we can try again 
     // return a zero saying we must stop erra o bad 

    } 
    return 1; 
} 

回答

0

如果您只對超時異常感興趣,請分別捕獲這些異常。大多數IO方法都可能拋出一個IOException異常,但是IOException有許多不同的子類(它們本身有更多的子類),您可以分別捕獲和處理它們。

例如。

try { 
    conn = server.accept(); 
} catch (SocketTimeoutException e) { 
    return 2; 
} catch (IOException e) { 
    // socket exception will not be recaught 
    // even if return statement wasn't used 
    return 0; 
} 
return 1; 

getCause方法被提供時創建例外它們可以用字符串消息創建,但也被拋出可能已引起該異常的異常作爲。因此,允許捕捉異常情況的人可以看到導致異常的完整細節。

例如。

public double addNumbers(String a, String b) { 

    try { 
     double i = Double.parseDouble(a); 
     double j = Double.parseDouble(b); 
     return i + j; 
    } catch (NullPointerException cause) { 
     throw new IllegalArgumentException(
      "Arguments aren't allowed to be null", cause); 
    } catch (NumberFormatException cause) { 
     throw new IllegalArgumentException(
      "One or more arguments weren't numbers", cause); 
    } 
} 

上述案例是有點遲鈍,但它顯示了與原始異常的原因拋出一些例外可能被捕獲的主要(也許它可能會嘗試從恢復),然後一個新的異常。有一個getCause方法允許調用者立即看到IllegalArgumentException最初拋出在addNumbers方法(並且這是用戶代碼庫中的問題)。然而,通過查看原因,他們將能夠看到關於該參數的更詳細的消息是非法的(NumberFormatException包括試圖被解析的字符串)。

1
accept() 

拋出各種異常。 SocketTimeoutException擴展IOException,但您可以在捕獲一般IOException之前「捕獲」它。這將允許您返回值,建議您可以再試一次。

這是否涵蓋你的3種情況,確定,IOException和超時?

相關問題