首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在API的多个方法中集中异常处理

如何在API的多个方法中集中异常处理
EN

Stack Overflow用户
提问于 2019-05-08 19:37:17
回答 2查看 635关注 0票数 5

这是一个简单的Java 8+问题,没有使用框架。

我们正在为更高层生成一个API,该API处理表示层以及其他活动。我们已经和调用者达成了接口协议,所以他们很高兴收到我们抛出的一些特定的异常。

同时,我们也在使用同一协议下的其他API,所以我们可以自己做一些事情并抛出异常,或者我们可以调用其他抛出约定异常的API。目前,我们对所调用的API抛出的异常不做任何处理。

问题是,在抛出异常时,我们处于处理中间活动的最佳位置,所以我们需要捕获我们的异常和由我们调用的异常提供的异常;基本上报告问题,引发系统控件等,然后重新抛出原始异常,以便顶层保持现在的状态。

我们的API的入口点类中有大约300个方法:

代码语言:javascript
复制
public void method1 (arguments for method 1) {
...
}

...

public void method300 (arguments for method 300) {
...
}

我清楚地知道,我可以创建一种方法来集中异常管理中要采取的操作,例如:

代码语言:javascript
复制
public void myExceptionHandler (Exception e) {
    if (e instanceOf X) {
    } else if ...
    ...
    throw particularExceptionAccordingTheCase 
}

但我也会避免修改这300个方法。

你知道如何在这300个方法中注入一个try-catch来向myExceptionHandler发送异常,而不是真正在每个方法中添加try-catch吗?

任何意见和想法都是非常感谢的!

- mprev0建议

我尝试过这种方法。它确实捕获了异常,等等,但我不能重新传送异常:我被迫捕获它,但这与将异常重新发送回顶层的要求背道而驰。虽然我可以抛出一个错误,但我在行抛出新的FileNotFoundException()时得到了一个编译器错误;

代码语言:javascript
复制
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。

使用一个装饰器并处理那里的接口就可以了。总结一下:

顶层类:

代码语言:javascript
复制
public class TopLayer {
    public static void main (String[] args) {
        MiddleLayer m = new MiddleLayer();
        m.method1();
    }
}

底层类包含特定的API和一些实现,唯一有趣的是它包含不受控制的java.lang.Exceptions,期望顶层来完成这项工作。但是,我们在中间工作,我们将做这项工作:

代码语言:javascript
复制
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

欢迎您提出更多意见!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-12 16:07:42

正如您在问题更新中看到的,最终的解决方案是两种不同方法的组合,一方面,使用实现java.lang.Thread.UncaughtExceptionHandler的mprev0方法,另一方面,添加装饰模式以能够重新抛出运行时异常。

到目前为止还没有其他方法,所以我将结束这个问题,并将此作为最完整的回答。

有关UncaughtExceptionHandler的更多信息可以在Java文档中找到,但仍然缺少示例,这里是:Advanced exception handling Thread.UncaughtExceptionHandler Example

有关装饰器图案使用的更多信息,可在此处找到:Decorator Design Pattern in Java Design Patterns - Decorator Pattern

以及如何在这里使用来处理异常:Rethrow UncaughtExceptionHandler Exception after Logging It

票数 0
EN

Stack Overflow用户

发布于 2019-05-09 17:24:17

您还可以在当前API之上创建一个代理API,在代理中有一个调用处理程序方法,并将此方法放入try catch块中。

https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html

https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html

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

https://stackoverflow.com/questions/56039919

复制
相关文章

相似问题

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