处理具有未知异常类的堆栈跟踪

bos*_*kop 8 java exception-handling rmi session-bean java-ee

我正在实现一个抛出ApplicationExceptions 的会话bean .这些异常具有链式堆栈跟踪,这些跟踪可能包含客户端上不可用的类的异常.就像是:

@Override
public void doSomethingSpecial(MyObject o) throws MyException {
    try {
        legacySystem.handle(o);
    } catch (LegacyException e) {
        logger.warn(e.getMessage(), e);
        throw new MyException(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,客户端可能会获得一个没有类的异常.这可能导致:

Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
    at sun.proxy.$Proxy0.doSomethingSpecial(Unknown Source)
    at com.myapp.client.Client.main(Client.java:56)
Caused by: java.lang.ClassNotFoundException: MyLegacyException
Run Code Online (Sandbox Code Playgroud)

我不希望客户端知道可以在服务器端抛出的所有可能的异常,但是拥有堆栈跟踪永远不会坏.

你是如何处理这些问题的?Interceptor在将异常发送回客户端时,实现将堆栈跟踪解耦的可行解决方案是什么?但是那时Interceptor应该只处理通过的调用RemoteInterface,因为内部我对整个堆栈跟踪感兴趣.

zae*_*dam 1

这取决于您的客户类型。如果客户是另一个正在开发另一个组件或子系统的团队,我同意您的观点:

拥有堆栈跟踪永远不会坏

但是,如果他们是不了解您的应用程序内部结构的客户,那么他们就没有理由知道您的异常类,甚至没有理由查看您的堆栈跟踪。如果有一个协议强制您捕获所有异常并将它们包装在带有error_code属性的高级异常类中,那就太好了。这样,您就可以为应用程序中的每个 catch 语句指定一个特定的错误代码,并且您将为客户提供这些代码的列表。

无论如何,从技术角度来看,如果您的客户无权访问您的内部Exception类,那么他们就无法在没有引用的情况下访问您的堆栈跟踪ClassNotFoundException。如果您确实希望他们看到堆栈跟踪,一种解决方案可能是让一个方面位于 API 的最上层(将由客户端调用)并捕获所有异常,写入堆栈跟踪在 a 中String并将其作为最终异常的属性发送,该异常将被调用者捕获。这样,调用者可以将堆栈跟踪作为异常的格式化字符串属性进行访问。

编辑:

您甚至可以配置构建脚本,以便此方面永远不会成为您的发行版本的一部分。因此,您可以仅在调试版本中提供此堆栈跟踪消息。