2015-11-03 42 views
2

如何檢查特定的例外情況,例如SocketException留言"Socket closed"?我們可以比較字符串這樣的:Android:如何檢查特定的異常?

if (exception.getMessage().equals("Socket closed"))... 

但有一些巧妙的方法,比較喜歡的錯誤代碼,或比較恆定的異常值?

除非SocketException總是"Socket closed",但在文檔中它指出這個類是所有套接字異常的超類,所以有多個。

更新: 我不想檢查異常類。如果我這樣做,我會用專門的catch,而不是檢查TOR一類明確:

catch (SocketException ex) { ... } 

我想要一些更巧妙的方法,以不同的兩個例外它們是同一個類的實例,而不是通過比較像這樣的字符串:

try { 
    int i = 2; 
    if (i == 1) throw new SocketException("one"); 
    else if (i == 2) throw new SocketException("two"); 
} 
catch (SocketException ex) { 
    if (ex.getMessage().equals("one")) { ... } 
} 

在這種特殊情況下,我會拋出異常來顯示它是什麼,但實際上它可以是代碼不受我控制。

另外我注意到,在一個特定的案例方法中的異常消息拋出「套接字關閉」,在另一種不同的方法拋出「套接字關閉」。所以堅持這個信息也不是很可靠。

+1

比較異常消息是一個壞主意。此消息僅供程序員使用,並且可以在新版本的API中隨時更改。所以,@Jim是對的,他描述了正確的方式。 –

回答

0

您可以使用:

exception.getClass().getSimpleName(),並將其與SocketException

希望這有助於。

2

你的問題有不同的方法,取決於你想要達到的目標。爲確定是否有你想要的例外,最簡單的方法是使用instanceof因爲一個Exception是一類爲好,即:

if (myException instanceof SocketException) { 
    ... 
} 

但是,你再加入的消息或可能性的內容要求拋出的Exception實際上是您感興趣的Exception的一個子類。在「分類」的情況下,你可以檢查它是否是一個子類:

if (myException instanceof SocketException && 
    myException.getClass() != SocketException.class) { 
    // then I'm an instance of a subclass of SocketException, but not SocketExcpetion itself 
} 

,或者相反,只評估父類:

if (myException instanceof SocketException && 
    myException.getClass() == SocketException.class) { 
    // then I'm an instance of the class SocketException, and not a cubclass of SocketExcpetion!! 
} 

這些作爲「錯誤代碼」你似乎在尋找 - 確定班級的身份。

但是,如果您確實對可讀的錯誤內容感興趣,那麼您擁有的解決方案應該是您的實施。這看起來不太可能,但有時候這是需要的。