我对如何使用 ThreadLocal 有点模糊(而且还有其他一些 tupos),但是像这样:
public class IgnorableException {
static class DontIgnoreCount {
int count;
}
// Thread local variable containing each thread's ID
private static final ThreadLocal<DontIgnoreCount> dontIgnoreCount =
new ThreadLocal<DontIgnoreCount>();
static void incrementDontIgnore() {
DontIgnoreCount counter = dontIgnoreCount.get();
if (counter == null) {
counter = new DontIgnoreCount();
dontIgnoreCount.set(counter);
}
counter.count++;
}
static void decrementDontIgnore() {
DontIgnoreCount counter = dontIgnoreCount.get();
// Must not be null here
counter.count--;
static bool shouldSignal() {
DontIgnoreCount counter = dontIgnoreCount.get();
return counter.count > 0;
}
}
要使用,请在 try 范围的早期调用 DontIgnoreCount.incrementIgnoreCount(),并在 finally 范围的后期调用 DontIgnoreCount.decrementIgnoreCount()。
当发出遵循此协议的异常信号时,仅在 shouldSignal 返回 true 时才发出信号。
void iWannaCatchException() {
try {
IgnornableException.incrementDontIgnore();
int x = someOptionallySignallingMethod();
}
catch (...) {
...
}
finally {
IgnorableException.decrementDontIgnore();
}
}
void iDontWannaCatchException() {
int x = someOptionallySignallingMethod();
}
int someOptionallySignallingMethod() {
if (somethingBad) {
if (IgnorableException.shouldSignal()) {
throw new BadException();
}
}
return 42;
}
请注意,上面没有显示throws
您必须添加以使编译器满意的任何子句。这种机制不会消除对这些的需求。
您还可以实现一个委托/观察者方案,用一堆观察者对象替换简单的计数器,并将消息传递给观察者而不是抛出异常。但这本身(没有耦合的异常/尝试范围)不允许将堆栈吹到适当的恢复点。