在不创建新Throwable的情况下向Throwable添加信息的通用方法

时间:2008-11-19 16:40:26

标签: java exception

添加一种通用的方法来向Throwable添加信息而不创建新的Throwable是否有益?

我经常看到这样的代码:

try {
  foo();
} catch(Exception e) {
  throw new Exception(e.getMessage() + " extra info=" + blah, e);
}

最好是添加Throwable.setProperty(String key,String value)以使上面的代码成为以下代码?

try {
  foo();
} catch(Exception e) {
  e.setProperty("extra info", blah);
  throw e;
}

可以在消息和堆栈列表之间打印额外的信息(每行一个)。

优点:  1.不需要创建新的Throwable就可以添加额外的信息。  2.堆栈跟踪不会有多层原因跟踪     (因此更容易阅读)  3.降低创建额外堆栈跟踪的成本。

3 个答案:

答案 0 :(得分:3)

链式异常已经解决了删除冗余堆栈帧的问题。也就是说,您只会看到列出一次的给定堆栈帧。这是一个意见问题,但我认为缺少链式异常是一个缺点。

不鼓励RuntimeException的扩展会很好。这可能在这方面有所帮助。

当堆栈展开时,干预堆栈帧可能希望添加它们自己的上下文。这可能导致房产的破坏。应该有一种处理它的机制,例如给定属性名称的一堆值。

在核心Java中永远不会发生这种情况,但是没有什么能阻止你将这种约定用于你自己的异常类。

答案 1 :(得分:1)

像往常一样,使用Exceptions,它非常依赖于场景。虽然您应该尝试并特定于您正在捕获的异常,但您还要明确说明当前范围中的异常>的原因,而不是增加从另一个范围抛出的异常。如果您没有任何内容可以帮助调用者并且无法执行某些操作来响应特定异常,那么就让它传播。如果您的作用域中存在与调用者相关的信息,请将您的异常与您的信息一起抛出,并将其链接到捕获的异常。这里的关键是范围。始终从当前范围生成结果,并允许其他范围执行相同的操作。

答案 2 :(得分:0)

一般来说,我认为在这种情况下使用标准习语会更好。在这种情况下,标准习惯用法是包装异常,如下所示:

try {
  foo();
} catch (Exception e) {
  throw new MySpecificException("extra info=" + blah, e);
}

此外,通常最好不要捕获通用异常。如果要捕获并向RuntimeException添加信息,请执行此操作,并创建新的RuntimeException。否则,请仔细考虑要捕获和抛出的检查异常。