Bugreport

Gemacht nicht, aber ich weiß wie das geht.
Die Ausgabe erfolgt über System.err.println();

Du könntest eine eigene Unterklasse von PrintStream schreiben die anders mit Objekten die von Throwable erben verfährt bei der Ausgabe und die dann über System.setErr(meinPrintStream); einbauen.
 
naja ich dachte jetzt das es ne leichte moglichkeit gibt den system output zu bekommen, also alles was über system.out oder system.err rausgeht
 
Eine solche kenne ich nicht, zumal die Ausgaben ja auch ggf. umgeleitet werden.
Zum Beispiel in der Anfängerentwicklungsumgebung BlueJ, da hat man die Konsole in nem kleinen extra Fenster.

Aber ich glaube das wäre auch schlecht. Denn wenn du wirklich nur den Output hättest, dann hättest du ja reinen Text bei dem du dann noch die Exceptions extra raus filtern musst.

Den PrintStream umzuschreiben stelle ich mir da einfacher vor.
 
Wie bereits erwähnt und in der DOC geschrieben sollten Errors nicht gecatched werden. Darum sollst du auch nie Throwable catchen sondern höchstens Exception da Errors einen Fehler in der VM signalisieren und diese daraufhin beenden sollten.
Wie Technoblade bereits sagte : ne eigene abgeleitete Klasse von PrintStream und mit System.setErr(PrintStream) setzen. Darin kannst du dann nach den Exceptions parsen *die in Java zum glück ne feste Form haben*. Aber wie gesagt : ob es wirklich so sinnvoll ist wirklich JEDE Exception zu catchen könnte man zu nem Streitpunkt machen.
 
Ja, das stimmt schon, sinvoll wäre es nur alle Exeptions zu catchen. wenn ich allerdings eine ableitung von Printstream schreibe, so werde ich ja dann wieder das ausgangsproblem haben, denn die exeptions ausgeben kann ich bereits, sodass diese per httppost eingetragen werden.
Das problem wäre wieder das, das ich nicht alle exceptions bekomme. wie oben von euch beschrieben müsste ich erstmal einen "thread-listener" haben, der mir eine liste aller threads aktuel hält. dies würde aber wahrscheinlich einiges an performance fressen. deswegen meine idee mit dem output der console
 
Naja wenn du nur System.err ersetzt dann bekommst du natürlich nicht alle .. darum müsstest du auch zusätzlich zu System.err noch System.out ersetzen. Weil alles was auf der Console landet wird über diesen beiden Streams geleitet. Und jetzt einen Text-Parser mit RegEx zuschreiben sollte kein Problem darstellen ... oder wo liegt jetzt dein Problem falls ich es noch nicht ganz erfasst habe.
 
Hi leute,

anscheind ist mein problem doch nicht so richtig gelöst... ich habe nun den ein bisschen was gecodet und bin auf ein problem gestoßen...

Code:
public class MyOutputStream extends OutputStream {
	private StringBuilder stringBuilder;

	public MyOutputStream(StringBuilder stringBuilder) {
		super();
		this.stringBuilder = stringBuilder;
	}

	public void write(int i) {
		char[] chars = new char[1];
		chars[0] = (char) i;
		String s = new String(chars);
		stringBuilder.append(s);
		new ReportABugDialog(stringBuilder.toString());
	}
}

mit diesem code wird bei jedem buchstaben der dialog geöffnet, wie kann man es machen, das der dialog erst am ende gezeigt wird?
Ich möchte das ganze am liebsten ohne eine textdatei oder so machen, mit einer txt wärs kein problem....

Grüße Maik
 
Naja so schon mal nicht da write(byte) write(char) und write(int) immer nur EIN Zeichen erzeugen. Du müsstest also write(byte[]) oder write(byte[], int, int) überschreiben um eine zusammenhängende Information zu bekommen.
Und warum du von OutputStream erbst verstehe ich nicht ganz da System.err und System.out PrintStreams sind ... du also dierekt von PrintStream ableiten und die Methode println(String) überschreiben kannst. Wie du jetzt aber erkennen kannst wann das Ende einer zusammenhängenden Meldung erreicht ist ... tja da waren sie wieder meine drei Probleme ^^ ...
 
Soo...

ich habs funktionstüchtig hinbekommen... auch wenn ich dafür sicher flames kassieren werde...
Code:
PrintStream print = new PrintStream(new MyOutputStream(
				new StringBuilder()));
		System.setErr(print);
		System.setOut(print);
Code:
public class MyOutputStream extends OutputStream {
	private StringBuilder stringBuilder;
	private Thread timerThread;
	
	public MyOutputStream(StringBuilder stringBuilder) {
		super();
		this.stringBuilder = stringBuilder;
	}

	public void write(int i) {
		stringBuilder.append((char) i);
		startThread();
	}
	
	@SuppressWarnings("deprecation")
	private void startThread() {
		if (timerThread != null) {
			timerThread.stop();
		}
		timerThread = new Thread(new Runnable() {
			public void run() {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
				}
				new ReportABugDialog(stringBuilder.toString());
				stringBuilder = new StringBuilder();
			}
		});
		timerThread.start();
	}
}

Grüße Maik
 
Zurück