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

epggiuax  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(421)

不使用额外的变量就可以找出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. 
     }
 }
cetgtptt

cetgtptt1#

我必须同意蒂布托夫的观点。
在finally块中重新抛出异常与在每个catch块的实现逻辑之后再抛出异常相比毫无意义—这样做没有任何好处。所以他的方法是正确的。
一般来说,这样做比较好,因为您可以通过每次声明更具体的异常并每次将这些异常传递回调用堆栈来扩展它—通过创建自己的自定义异常类型并执行以下操作:

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

每次。
希望有帮助。

avkwfej4

avkwfej42#

你不能在finally子句中找到它们。捕获和最终捕获的范围是分开的。但由于您不想编写多个异常处理代码,因此我建议您使用Java7中引入的特性。

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

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

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

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

wswtfjt7

wswtfjt73#

不使用附加变量是不行的。如果不使用其他变量,则只能在异常特定逻辑之后再次引发异常:

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

相关问题