这是一个简单的Java 8+问题,没有使用框架。
我们正在为更高层生成一个API,该API处理表示层以及其他活动。我们已经和调用者达成了接口协议,所以他们很高兴收到我们抛出的一些特定的异常。
同时,我们也在使用同一协议下的其他API,所以我们可以自己做一些事情并抛出异常,或者我们可以调用其他抛出约定异常的API。目前,我们对所调用的API抛出的异常不做任何处理。
问题是,在抛出异常时,我们处于处理中间活动的最佳位置,所以我们需要捕获我们的异常和由我们调用的异常提供的异常;基本上报告问题,引发系统控件等,然后重新抛出原始异常,以便顶层保持现在的状态。
我们的API的入口点类中有大约300个方法:
public void method1 (arguments for method 1) {
...
}
...
public void method300 (arguments for method 300) {
...
}
我清楚地知道,我可以创建一种方法来集中异常管理中要采取的操作,例如:
public void myExceptionHandler (Exception e) {
if (e instanceOf X) {
} else if ...
...
throw particularExceptionAccordingTheCase
}
但我也会避免修改这300个方法。
你知道如何在这300个方法中注入一个try-catch来向myExceptionHandler发送异常,而不是真正在每个方法中添加try-catch吗?
任何意见和想法都是非常感谢的!
- mprev0建议
我尝试过这种方法。它确实捕获了异常,等等,但我不能重新传送异常:我被迫捕获它,但这与将异常重新发送回顶层的要求背道而驰。虽然我可以抛出一个错误,但我在行抛出新的FileNotFoundException()时得到了一个编译器错误;
public class myExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("gotcha!");
if (e instanceof java.lang.Error) {
System.out.println("AAT-CORE: Fatal Error");
throw new java.lang.Error(e.getCause());
} else if (e instanceof java.lang.Exception) {
System.out.println("AAT-CORE: Exception Error");
throw new FileNotFoundException();
}
}
}
有什么想法吗?
-经过进一步挖掘,用装饰器模式修复
以前的类实现不起作用,因为我不能更改方法的签名,并且需要重新抛出java.lang.Exception。
使用一个装饰器并处理那里的接口就可以了。总结一下:
顶层类:
public class TopLayer {
public static void main (String[] args) {
MiddleLayer m = new MiddleLayer();
m.method1();
}
}
底层类包含特定的API和一些实现,唯一有趣的是它包含不受控制的java.lang.Exceptions,期望顶层来完成这项工作。但是,我们在中间工作,我们将做这项工作:
public class MiddleLayer extends BottomLayer {
public MiddleLayer () {
final UncaughtExceptionHandler subclass = Thread.currentThread().getUncaughtExceptionHandler();
Thread.currentThread().setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
System.out.println("gotcha2!");
// carry on with prior flow
subclass.uncaughtException(thread, ex);
}
});
}
}
通过这种方式,我可以获得system.out,并将java.lang.Exception传播到顶层。
装饰者的灵感来自这里:Rethrow UncaughtExceptionHandler Exception after Logging It
欢迎您提出更多意见!
https://stackoverflow.com/questions/56039919
复制相似问题