在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。