Question

Existe-t-il un moyen de détecter une méthode qui génère une écriture dans STDERR? J'essaie de pré-suspendre certaines informations avec chaque écriture STDERR.

Disons que notre méthode est la suivante:

parser.thatGeneratesSTDERR();

ça va générer quelque chose comme

line 37:29 pas d'alternative viable au caractère "a"

puis-je juste envelopper avec quelque chose qui attrape le stderr pour être écrit et pré-pendez certains info donc ça va ressembler à ceci à la place:

Fichier: mybadfile.txt - ligne 37:29: aucune alternative viable pour le caractère "a"

Je sais que je pourrais probablement explorer le code écrit par STDERR, mais je ne veux vraiment pas le faire. Je préférerais simplement envelopper du code autour de cette méthode.

Je dois noter que cette méthode ne génère pas toujours STDERR - la raison pour laquelle j’essaie de les intercepter est qu’elle NE DEVRAIT PAS générer de STDERR - mais comme cette méthode est appelée sur plusieurs fichiers 40) Je ne sais jamais quel fichier génère le message d’erreur. Il faut toujours beaucoup de temps pour le trouver.

MISE À JOUR alors, nous pouvons changer notre STDERR - J'oubliais juste que je devais remplacer mon impression dans mon nouveau STDERR ... voici le code correspondant:

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);
}

Ensuite, pour chaque fichier que je teste, tout ce que je dois faire est de remplacer le fichier errf par le nom de fichier et le résultat obtenu est attendu ...

merci beaucoup!

Était-ce utile?

La solution

Je ne sais pas si cela fonctionnera, vu le fonctionnement de System.setErr.

Je créerais une nouvelle classe qui étend le flux d'impression et écrase les méthodes pour ajouter un commentaire. Ensuite, définissez le flux d'erreur sur votre nouveau flux d'impression. N'appelez pas System.err.printxxx à partir de cette nouvelle classe.

ex ...

class PrependPrintStream extends PrintStream {

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

J'ai examiné l'implémentation PrintStream de sun et il semble que tous les délégués de printxxx aient pour tâche d'écrire (String), ce qui est privé au lieu de protégé. Je suppose que vous pouvez copier / coller le code.

EDIT ::

Une beaucoup meilleure solution consiste à utiliser la journalisation à la place de System.err. Cela vous permet d'activer et de désactiver vos instructions et de créer un gestionnaire d'erreur personnalisé. Votre gestionnaire spécifique peut ajouter l'instruction que vous souhaitez à la chaîne avant de l'imprimer sur System.err. Cela présente également l’avantage que seules les instructions qui utilisent votre enregistreur spécifique auront le texte ajouté et d’autres appels à System.err non.

Autres conseils

On dirait que vous voulez probablement regarder la programmation orientée aspect (AOP). En utilisant AOP, vous pouvez créer un proxy pour l’analyseur que vous appelez. Avant que la méthode appelle thatGeneratesSTDERR (), vous pouvez l'appeler. À partir de votre appel, vous pouvez sortir les informations souhaitées.

Notez que cela peut prendre un peu de lecture pour comprendre comment fonctionne AOP.

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

Alliance AOP - http://sourceforge.net/projects/aopalliance

Vous pouvez utiliser System.setErr pour rediriger stderr vers votre propre flux d'impression.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top