1

メソッドが STDERR への書き込みを生成するときにキャッチできる方法はありますか? 各STDERR書き込みでいくつかの情報を事前に保留しようとしています。

私たちの方法は次のとおりです。

parser.thatGeneratesSTDERR();

次のようなものが生成されます

行 37:29 文字 'a' で実行可能な代替手段がありません

stderr が書き込まれるのをキャッチする何かでそれをラップし、いくつかの情報を前に保留して、代わりに次のように見えるようにすることはできますか:

ファイル: mybadfile.txt -- 行 37:29 文字 'a' に実行可能な代替手段がありません

STDERR 書き込みを行う実際のコードを掘り下げることができることはわかっていますが、実際にはそうしたくありません。代わりに、このメソッドの周りにいくつかのコードをラップするだけです。

このメソッドは常に STDERR を生成するとは限らないことに注意する必要があります-私がそれらをキャッチしようとしている理由は、STDERR を生成するべきではないということです-しかし、これはかなりの数のファイル (40 以上) で呼び出されるため、私はどのファイルがエラー メッセージを生成しているかわかりません。見つけるのに永遠に時間がかかります。

更新 して、STDERRを変更できるようにします-新しいSTDERRでprintlnをオーバーライドする必要があることを忘れていました...関連するコードは次のとおりです。

public static String errfile = "";

static {
  final PrintStream currentErr = System.err;
  PrintStream newErr = new PrintStream(currentErr)
  { 
    public void println(String string) {
      print("File: " + errfile + " --");
      print(string);
      super.println();
    }
  };

  System.setErr(newErr);
}

次に、テストしている各ファイルに対して、errfileをファイル名に変更するだけで、出力が期待通りになります...

どうもありがとう!

4

3 に答える 3

1

System.setErrがどのように機能するかを考えると、これが機能するかどうかはわかりません。

印刷ストリームを拡張し、コメントを追加するメソッドを上書きする新しいクラスを作成します。次に、エラーストリームを新しいプリントストリームに設定します。この新しいクラスからSystem.err.printxxxを呼び出さないでください。

元...

class PrependPrintStream extends PrintStream {

PrependPrintStream(PrintStream ps, String pre){...}
...
public void print(boolean b) {
super.print(this.pre);
super.print(b);
}
...

sunのPrintStreamimplを調べたところ、すべてのprintxxxが保護ではなくプライベートであるwrite(String)に委任しているように見えます。コードをコピーして貼り付けることができると思います。

編集::

はるかに優れた解決策は、System.errの代わりにLoggingを使用することです。これにより、ステートメントのオンとオフを切り替えたり、カスタムエラーハンドラーを作成したりできます。特定のハンドラーは、System.errに出力する前に、文字列の前に必要なステートメントを追加できます。これには、特定のロガーを使用するステートメントのみにテキストが付加され、System.errへの他の呼び出しには含まれないという利点もあります。

于 2009-06-23T19:26:21.207 に答える
1

Aspect Oriented Programming (AOP) を見たいと思われるかもしれません。AOP を使用すると、呼び出しているパーサーへのプロキシを作成できます。メソッド呼び出しの前に thatGeneratesSTDERR() 呼び出すことができます。通話から、必要な情報を出力できます。

AOP がどのように機能するかを理解するには、少し読む必要があることに注意してください。

AspectJ - http://www.eclipse.org/aspectj/

AOP アライアンス - http://sourceforge.net/projects/aopalliance

于 2009-06-23T19:15:42.570 に答える
0

System.setErrを使用して、stderrを独自のPrintStreamにリダイレクトできます。

于 2009-06-23T19:22:21.510 に答える