如何获取重新包装的异常消息?

时间:2013-02-07 05:21:18

标签: java exception

我开发了一个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" ..在这种情况下如何处理异常?如何获取由我投掷的所有邮件?

1 个答案:

答案 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();
}