【发布时间】:2010-11-09 00:16:36
【问题描述】:
在 C# 中,我可以使用 throw; 语句重新引发异常,同时保留堆栈跟踪:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
在 Java 中是否有类似的东西(不会丢失原始堆栈跟踪)?
【问题讨论】:
-
为什么你认为它丢失了原始的堆栈跟踪?当您抛出新的 SomeOtherException 并忘记在构造函数或 initCause() 中分配根本原因时,唯一的方法就是释放它。
-
我相信这就是代码在 .Net 中的行为方式,但我不再积极。在某个地方查找它或运行一个小测试可能是值得的。
-
Throwables 不会因为扔掉它们而被修改。要更新堆栈跟踪,您必须调用fillInStackTrace()。在Throwable的构造函数中调用此方法很方便。 -
在 C# 中,是的,
throw e;将丢失堆栈跟踪。但不是在 Java 中。 -
Oracle 的一些关于 Java 7 异常的文档:Catching Multiple Exception Types and Rethrowing Exceptions with Improved Type Checking