0

私は EJB サービスを開発していますが、私のサービスは 1 種類の例外しかスローできません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 は message"Not enough money"で意味のある例外をスローするので、このメッセージを client に表示したいと思います。しかし、メソッド 2 はこの例外を new message"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 コンストラクターの 2 番目のパラメーターに注意してください。このコンストラクターは、そのスーパークラスの 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 に答える