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



是否可以在不使用附加变量的情况下找出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. 
     }
 }

不使用额外的变量。如果不使用额外的变量,您只能在异常特定逻辑之后再次抛出异常:

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

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

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

如果您使用的是java6或更早版本,那么节省编码工作的唯一方法就是通过一个方法来处理它们。

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

然后您可以使用instanceof来确定异常的类型并执行您的操作。

我不得不同意tibtof的观点。

与在每个catch块的实现逻辑之后重新抛出异常相比,在finally块中重新抛出异常毫无意义——这样做不会带来任何好处。因此,他的解决方案是正确的。

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

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

每次。

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新