문제

메서드가 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을 파일 이름으로 변경하기만 하면 예상대로 출력이 나옵니다.

정말 감사합니다!

도움이 되었습니까?

해결책

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의 PrintStream impl을 조사해 보았고 보호되는 대신 비공개인 write(String)에 대한 모든 printxxx 위임처럼 보입니다.코드를 복사/붙여넣기하시면 될 것 같습니다.

편집하다::

많이 더 나은 해결책은 System.err 대신 Logging을 사용하는 것입니다.이를 통해 명령문을 켜고 끌 수 있으며 사용자 정의 오류 처리기를 만들 수 있습니다.특정 처리기는 System.err로 인쇄하기 전에 문자열 앞에 원하는 명령문을 추가할 수 있습니다.이는 또한 특정 로거를 사용하는 명령문에만 텍스트가 추가되고 System.err에 대한 다른 호출에는 추가되지 않는다는 장점도 있습니다.

다른 팁

아마도 AOP(Aspect Oriented 프로그래밍)를 살펴보고 싶은 것 같습니다.AOP를 사용하면 호출하는 파서에 대한 프록시를 만들 수 있습니다.thatGeneratesSTDERR() 메서드를 호출하기 전에 호출하도록 할 수 있습니다.통화에서 원하는 정보를 출력할 수 있습니다.

AOP의 작동 방식을 이해하려면 약간의 독서가 필요할 수 있습니다.

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

AOP 얼라이언스 - http://sourceforge.net/projects/aopalliance

당신이 사용할 수있는 시스템.setErr stderr를 자신의 PrintStream으로 리디렉션합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top