2

是否可以不使用额外的变量来找出在 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. 
     }
 }
4

3 回答 3

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;       
}
于 2012-08-24T18:51:19.690 回答
2

您无法在 finally 子句中捕获它们。catch 和 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 来确定异常的类型并执行您的操作。

于 2012-08-24T19:09:37.090 回答
1

我必须同意tibtof。

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

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

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

每一次。

希望有帮助。

于 2012-08-24T19:11:16.090 回答