2016-01-28 59 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(); 
    } 
} 
相关问题