7

最終的には、

if (badThingsHappen) {
 log the issue
 throw exception with description
}

ここでの明らかな冗長性は、多くの場合、例外の説明とログに記録されるメッセージが(多くの場合)同じであるということです。

これは不必要に冗長に見えます

if (badThingsHappen) {
 logger.error("oh no! not again!");
 throw new AppException("oh no! not again!");
}

一時的な文字列の宣言は間違っていると感じます

if (badThingsHappen) {
 String m = "oh no! not again!";
 logger.error(m);
 throw new AppException(m);
}

Exceptionのコンストラクターにロギングを処理させても大丈夫ですか?より良い(よりクリーンな)方法はありますか?

4

4 に答える 4

3

ユーティリティメソッドを使用できます。

public class AppException extends Exception {
    public static AppException logAndThrow(Logger logger, String message) throws AppException {
        AppException e = new AppException(message);
        // log the stack trace as well
        logger.error(message, e);
        throw e;
    }
}

そしてそれを使用します:

if (badThingsHappen) {
    AppException.logAndThrow(logger, "oh no! not again!");
}
于 2012-04-30T17:02:02.737 に答える
2

私は通常、例外をスローするときよりも、キャッチしたときにログに記録することを好みます。

これにより、ログがかなりクリーンアップされ、ロギング時に例外に関連付ける情報がコンテキストに依存する可能性があるため、「クライアント」コードが例外と情報出力をより正確に処理できるようになります。

発生したらすぐにログに記録たい場合は、例外を作成して、スローする前にログに記録します。たとえば、次のようになります。

if(badthingshappen){
    Exception e = new Exception("holy $%##");
    logger.log(e);
    throw e;
}

はい...少し冗長ですが、これJavaです。

于 2012-04-30T16:59:49.260 に答える
1

通常、例外とロギング要件を処理する場合、例外にロギングサポートを含めます。

例外は通常、プロジェクトのBase Exceptionクラスから継承され、ロギングlog4jまたはその他のロギングユーティリティ用のフックがあります。

class Problem extends java.lang.Exception {
  private boolean debug=false;
  public Problem(String message) {
    if(debug) {
      logging.exception(message);
      /* Maybe a stack trace? */
    }
  }
}
于 2012-04-30T17:00:39.790 に答える
1

今日、私は自分でエラーログメソッドを作成しました(これは、リスナーメソッドで発生したエラーをログに記録するために使用されるため、エラーが発生したメソッドと、追跡に役立つリスナーが実装されているオブジェクトもログに記録します) :

protected void listenerError(String listenerMethodName, Object listener,
        RuntimeException e) {
    logger.error("Exception while calling " + listenerMethodName
            + " on object " + listener, e);
    throw e;

}

問題のクラス(正確には基本クラス)でそれを書きました。おそらくそのクラス(およびすべてのサブクラス)でロガーを使用したいからです。別のオプションは、ユーティリティクラスにユーティリティメソッドを作成し(私はそのためのExceptionクラスを作成しません)、パラメータとしてロガーを提供することです。

class ExceptionUtil {

  public static error(Exception e, Logger logger) {
     logger.error(e);
     throw e;
  }
}

もちろん、必要に応じて、このメソッド(またはそのオーバーロードされたバージョン)のパラメーターとしてメソッドとオブジェクトを提供できます。

于 2012-04-30T18:55:53.520 に答える