2016-01-28 64 views
2

在感興趣的程序中,在執行方法()期間,可能會發生一些與HTTP相關的異常。由於某些原因,該方法被設置爲能夠引發ExpException。我的興趣只在特定類型的例外,即UnknownHostException異常,可以通過使用捕獲是異常原因的UnknownHostException

if (e.getCause().getCause().getCause() instanceof UnknownHostException) 

,我希望你同意訪問是非常討厭的方式。因此,這工作正常:

public class ExportException extends Exception; 

class sth{ 
    method() throws ExpException; 
} 

class main{ 
    try{ 
    method() 
    } catch(ExpExceptione e){ 
    if (e.getCause().getCause().getCause() instanceof UnknownHostException){ 
     doSthElse(); 
    } 
    } 

但是,我希望如下所述做。不幸的是,Eclipse大叫

UnknownHostException的無法到達的catch塊。這個例外是從未從try語句拋出的 。

對我有幫助嗎?我不想使用getCause()^ 3。

另外:這是一個很大的項目,我是新來的新手,寧可不要亂搞外面的課,而只是「主」。

我的計劃是這樣的:

public class ExportException extends Exception; 

class sth{ 
    method() throws ExpException; 
} 

class main{ 
    try{ 
    method() 
    } catch(UnknownHostException e){ 
    doSth(); 
    } catch(ExpExceptione){ 
    doSthElse(); 
    } 
+0

這個異常沒有被拋出。這從錯誤消息中看起來很明顯。 –

+0

那麼,如果異常是你捕獲異常的*原因*,那麼它就不會被拋到你試圖捕獲它的地方。要麼改變捕獲它的代碼的一部分,並使其成爲另一個異常的原因,要麼像你一直在做的那樣需要得到原因。 – RealSkeptic

回答

2

的UnknownHostException是被檢查的異常IOException的一個亞型。

拋出檢查異常的方法必須在throws聲明聲明它們。

因此,當您調用聲明中沒有throws UnknownHostException的方法時,您將永遠無法捕獲此異常 - 代碼無法訪問且編譯器無誤。

Here您可以看到如何很好地檢查異常原因是否包含任何特定異常。

static boolean hasCause(Throwable e, Class<? extends Throwable> cl) { 
    return cl.isInstance(e) || e.getCause() != null && hasCause(e.getCause(), cl); 
} 

catch(ExpException e) { 
    if (hasCause(e, UnknownHostException.class)) { 
     doSmth(); 
    } else { 
     doSmthElse(); 
    } 
} 
相關問題