0

我开发了一个 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".. 在这种情况下如何处理异常?如何获取我抛出的所有消息?

4

1 回答 1

0

如果这是您的代码,我建议您以不同的方式包装异常:

catch (Exception e) {
  logger.error("Error when creating account", e);
  throw new MyServiceException("Error when creating account" + e.getMessage(), e);
}

注意 MyServiceException 构造函数中的第二个参数。此构造函数应调用其超类的 super(message, throwable) 构造函数。

如果以这种方式完成,那么您可以通过调用 exception.getCause() 方法获得原始异常。因此 exception.getCause().getMessage() 获取其原始消息。

通常,所有第三方 API 都会像上面描述的那样进行异常包装,因此从设计良好的库中引用异常的原因应该没有问题。

更新:组合异常消息并用换行符分隔它们的代码示例。我没有测试过它,但我很确定它正在工作,更重要的是说明了如何做你想做的事情:

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();
}
于 2013-02-07T05:40:02.417 回答