在Java中引发exception而不丢失堆栈跟踪

在C#中,我可以使用throw; 语句在保留堆栈跟踪的同时重新抛出exception:

 try { ... } catch (Exception e) { if (e is FooException) throw; } 

在Java中是否有这样的东西( 不会丢失原始堆栈跟踪 )?

 catch (WhateverException e) { throw e; } 

将简单地重新抛出你捕获的exception(显然周围的方法必须通过它的签名来允许)。 exception将保持原始的堆栈跟踪。

我会比较喜欢:

 try { ... } catch (FooException fe){ throw fe; } catch (Exception e) { ... } 

您也可以将exception封装在另一个exception中,并通过以Throwable作为原因参数传入Exception来保留原始堆栈跟踪:

 try { ... } catch (Exception e) { throw new YourOwnException(e); } 

在Java中几乎是一样的:

 try { ... } catch (Exception e) { if (e instanceof FooException) throw e; } 

在Java中,你只是抛出你捕获的exception,所以throw e而不是throw 。 Java维护堆栈跟踪。

像这样的东西

 try { ... } catch (FooException e) { throw e; } catch (Exception e) { ... } 
 public int read(byte[] a) throws IOException { try { return in.read(a); } catch (final Throwable t) { /* can do something here, like in=null; */ throw t; } } 

这是一个方法抛出IOException的具体例子。 final方法t只能容纳从try块抛出的exception。 额外的阅读材料可以在这里和这里find。