首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向Throwable添加信息而不创建新Throwable的通用方法

向Throwable添加信息而不创建新Throwable的通用方法
EN

Stack Overflow用户
提问于 2008-11-19 16:40:26
回答 3查看 785关注 0票数 2

添加一种通用的方法来添加信息到Throwable而不创建新的Throwable会有好处吗?

我经常看到这样的代码:

代码语言:javascript
复制
try {
    foo();
} catch (Exception e) {
    throw new Exception(e.getMessage() + " extra info=" + blah, e);
}

添加Throwable.setProperty(String key, String value)会不会更好,这样上面的代码就变成了下面的代码?

代码语言:javascript
复制
try {
    foo();
} catch(Exception e) {
    e.setProperty("extra info", blah);
    throw e;
}

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

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

EN

回答 3

Stack Overflow用户

发布于 2008-11-19 16:48:07

链式异常已经负责删除冗余堆栈帧。也就是说,您将只看到一个给定的堆栈框架列出一次。这是一个见仁见智的问题,但我认为缺少链式异常是一个缺点。

不鼓励扩展RuntimeException将是一件好事。这可能会在这方面有所帮助。

当堆栈展开时,中间堆栈帧可能希望添加它们自己的上下文。这可能会导致属性遭到重创。应该有一种机制来处理这一问题,比如给定属性名称的值堆栈。

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

票数 3
EN

Stack Overflow用户

发布于 2008-11-19 21:51:52

像往常一样,除了例外,它非常依赖于场景。尽管您应该尝试特定于您正在捕获的异常,但您还希望明确说明当前作用域中异常的原因,而不是增加从另一个作用域抛出的异常。如果您没有任何可以帮助调用者的东西,并且无法执行某些操作来响应特定的异常,那么就让它传播。如果您的作用域中有与调用者相关的信息,则抛出包含您的信息的异常,并链接到捕获的异常。这里的关键是作用域。始终从当前作用域生成结果,并允许其他作用域执行相同的操作。

票数 1
EN

Stack Overflow用户

发布于 2008-11-19 16:47:52

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

代码语言:javascript
复制
try {
  foo();
} catch (Exception e) {
  throw new MySpecificException("extra info=" + blah, e);
}

此外,一般来说,最好不要捕获泛型异常。如果您想捕获信息并将其添加到RuntimeException,那么执行此操作,然后创建一个新的RuntimeException。否则,请仔细考虑要捕获并抛出哪些检查过的异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/302533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档