添加一种通用的方法来添加信息到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.减少创建额外堆栈跟踪的成本。
发布于 2008-11-19 16:48:07
链式异常已经负责删除冗余堆栈帧。也就是说,您将只看到一个给定的堆栈框架列出一次。这是一个见仁见智的问题,但我认为缺少链式异常是一个缺点。
不鼓励扩展RuntimeException将是一件好事。这可能会在这方面有所帮助。
当堆栈展开时,中间堆栈帧可能希望添加它们自己的上下文。这可能会导致属性遭到重创。应该有一种机制来处理这一问题,比如给定属性名称的值堆栈。
这在核心Java中永远不会发生,但没有什么能阻止您在自己的异常类中使用这种约定。
发布于 2008-11-19 21:51:52
像往常一样,除了例外,它非常依赖于场景。尽管您应该尝试特定于您正在捕获的异常,但您还希望明确说明当前作用域中异常的原因,而不是增加从另一个作用域抛出的异常。如果您没有任何可以帮助调用者的东西,并且无法执行某些操作来响应特定的异常,那么就让它传播。如果您的作用域中有与调用者相关的信息,则抛出包含您的信息的异常,并链接到捕获的异常。这里的关键是作用域。始终从当前作用域生成结果,并允许其他作用域执行相同的操作。
发布于 2008-11-19 16:47:52
总的来说,我认为在这样的情况下使用标准的习惯用法更好。在这种情况下,标准用法是包装异常,如下所示:
try {
foo();
} catch (Exception e) {
throw new MySpecificException("extra info=" + blah, e);
}此外,一般来说,最好不要捕获泛型异常。如果您想捕获信息并将其添加到RuntimeException,那么执行此操作,然后创建一个新的RuntimeException。否则,请仔细考虑要捕获并抛出哪些检查过的异常。
https://stackoverflow.com/questions/302533
复制相似问题