我开发了一个EJB服务,我的服务只能抛出一种异常 - MyServiceException
。即所有发生的异常都包含在MyServiceException
中并重新抛给客户端。但我不想向客户端显示堆栈跟踪(出于安全原因),我只想记录此堆栈跟踪并仅向客户端显示错误消息。所以简单地编写以下代码就足够了:
catch (Exception e) {
logger.error("Error when creating account", e);
throw new MyServiceException("Error when creating account" + e.getMessage());
}
但是如果我有一堆方法怎么办:1 -2 -3。方法3使用消息"Not enough money"
抛出有意义的异常,因此我想向客户端显示此消息。但是方法2使用新消息"Some problem with your credit card"
重新包装此异常,因此在方法1中调用e.getMessage()
将只返回"Some problem with your credit card"
,而不是"Not enough money"
..在这种情况下如何处理异常?如何获取由我投掷的所有邮件?
答案 0 :(得分:0)
如果这是您的代码,我建议您以不同的方式包装异常:
catch (Exception e) {
logger.error("Error when creating account", e);
throw new MyServiceException("Error when creating account" + e.getMessage(), e);
}
注意MyServiceException构造函数中的第二个参数。这个构造函数应该调用它的超类的超级(message,throwable)构造函数。
如果以这种方式完成,那么您可以通过调用exception.getCause()方法获得原始异常。因此exception.getCause()。getMessage()获取其原始消息。
通常,所有第三方API都会像上面描述的那样进行异常包装,因此在设计良好的库中引用异常时应该没有问题。
UPDATE:组合异常消息的代码示例,并用新行字符分隔它们。我没有对它进行过测试,但我确信它正在运行,更重要的是说明了如何做你想做的事情:
private static String printExceptionMessages(Throwable throwable) {
StringBuilder result = new StringBuilder();
Throwable t = throwable;
while (t != null) {
result.append(t.getMessage());
result.append('\n');
t = t.getCause();
}
return result.toString();
}