如何从finally子句中抛出catch子句中捕获的异常?

时间:2012-08-24 18:48:22

标签: java exception try-catch-finally

是否可以不使用其他变量来找出catch子句中捕获的异常,然后从finally子句中再次抛出它?

public void exceptionalFunction() throws Exception
 {
    try
     {
         // exception causing code
     }
    catch (TypeAException e)
     {
        // exception specific logic
     }
    catch (TypeBException e)
     {
         // exception specific logic        
     }
    catch (TypeCException e)
     {
        // exception specific logic        
     }
    finally
     {
         // throw the exception that was caught, if one was caught. 
     }
 }

3 个答案:

答案 0 :(得分:6)

不使用其他变量。如果不使用其他变量,则只能在异常特定逻辑之后再次抛出异常:

catch (TypeAException e)
{
    // exception specific logic 
    throw e;       
}
catch (TypeBException e)
{
    // exception specific logic 
    throw e;       
}
catch (TypeCException e)
{
    // exception specific logic 
    throw e;       
}

答案 1 :(得分:2)

你无法在finally子句中捕获它们。捕获的范围最后是分开的。但由于您不想编写多个异常处理代码,我建议您使用Java 7中引入的功能。

....
....
catch (Exception1|Exception2|Exception2 e){
    //determine type and handle accordingly
}

如果您使用的是java6或更早版本,保存编码工作的唯一方法是通过方法处理它们。

....
....
catch(Exception1 e){
    handle(e);
}
catch(Exception2 e){
    handle(e);
}

然后你可以使用instanceof来确定异常的类型并做你的事。

答案 2 :(得分:1)

我必须同意tibtof。

在finally块中重新抛出异常与在每个catch块的实现逻辑之后执行它是没有意义的 - 这样做你什么也得不到。所以他是正确的解决方案。

一般来说,最好以这种方式执行此操作,因为您可以通过每次声明更具体的异常并每次将这些异常传递回调用堆栈来扩展它 - 通过创建自己的自定义异常类型并执行:

catch (TypeAException e) 
{ 
    // exception specific logic  
    throw new myCustomException("Custom message " + e.getMessage);      
} 

每一次。

希望有所帮助。