我很好奇,为什么是方法fillInStackTrace的java.lang.Throwable公开?
此方法将原始堆栈跟踪替换为调用它的位置,删除本地化异常所需的信息.它可以用于混淆,但不需要太多努力,因为新的堆栈跟踪将指向混淆代码.更好的方法是简单地隐藏异常或抛出异常.
但我无法找到在现有方法上调用此方法的任何合理案例Throwable.所以问题是:为什么这种方法是公开的?背后有什么意义吗?
Throwable.fillInStackTrace()的一个合法用例是非本地控制流:
例如,在我的TrueZIP框架中,我使用复杂的装饰器链来存储文件系统控制器.该链中的一个控制器是类FsLockController的一个实例.该对象负责管理文件系统的ReentrantReadWriteLock.现在,此链中更深处的文件系统控制器可能检测到需要写锁定,但FsLockController仅获取了读锁定.因为在没有死锁的情况下无法将读锁升级为写锁,所以必须抛出异常,这恰好是类FsNeedsWriteLockException的一个实例.然后,装饰FsLockController将捕获此异常,释放读锁并获取写锁,然后再次重试该操作.
这种非本地控制流程实际上非常有效,但有一点需要考虑:抛出和捕获异常很便宜,但填写或检查其堆栈跟踪是很昂贵的.现在因为这个特殊的异常类型是在这个文件系统控制器链中单独抛出和捕获的,所以我根本不需要堆栈跟踪,因此我可以安全地使用空方法体覆盖Throwable.fillInStackTrace()以抑制这种昂贵的操作.
可以在此处看到此异常类型的基类的源代码.
| 归档时间: |
|
| 查看次数: |
8081 次 |
| 最近记录: |