Bugreport

Maik639

Erfahrenes Mitglied
huhu,

ich hab mir gedacht, es wär doch super wenn man bugs reporten könnte.
soweit kein problem, dachte ich.
ich weiß nicht warum nicht alle exeptions und errors abgefangen werden..
als beispielcode könnte ich das liefern:

Code:
public static void main(String[] args) {
   try {
      new MyProgram();
   } catch (Throwable t) {
      reportBug(t);
   }
}

Ich kann dann in meiner reportBug Methode die exeption genau entgegen nehmen, so wie man sie sonst in der console sieht... bloß werden nicht alle angezeigt, warum?

Grüße Maik
 
Hast du denn innerhalb von "MyProgram()" irgendwie try-catch-Blöcke? Die Fehler die du Wort abfängst kommen natürlich nicht in deinem äußeren try-catch an.
Was du da vor hast ist aber schlechtes Design.
 
Auch exceptions die nicht "gecatched" werden, werden nicht immer angezeigt... wie würdest du es denn besser machen?
 
@CPoly: Nicht unbedingt. So wie ich ihn verstanden habe will er das als Bugreport nutzen. Mit anderen Worten, er will durchaus auch innerhalb des Programms so viele Fehler wie möglich abfangen. Aufdiese Art und Weise will er dann die Fehler die er ggf. irgendwo übersehen hat Abfangen, daraus einen Bugreport erstellen und den dann nach Möglichkeit dem Entwickler zustellen.
Es geht also keineswges darum sich Arbeit zu sparen in dem man einfach keine Exceptions mehr prüft.
 
genau das ist mein ziel, und per httppost würde ich diese dann bekommen, vorausgesetzt der user stimmt zu
 
Das du nicht alles geworfenen Exceptions bekommst liegt daran das nicht alle Exceptions an deinen MAIN-caller durchgereicht werden. Als einfachstes Beispiel neben wir mal den EventDispatchThread. Wenn der zur Runtime ne NPE wirft wird diese innerhalb des EDT gecatched und meistens über System.err ausgegeben. Um das zu umgehen müsstest du den EDT mit Reflections manipulieren *also n eigenen EDT implementieren und diesen dann versuchen mit Reflections der VM unterzuschieben*.
Oder zum Beispiel von Throwable erweitert die Errors ... diese sollten nicht gecatched werden und beenden in 99% die VM *das 1% wo die VM nicht beendet wird ist wenn der Shutdown-Thread selbst aussteigt*.

Aber ansonsten ist das keines wegs schlechtes Design. Ich schließ mich der Meinung von Technoblade voll an.
 
Spike, nach deinemPosts hat es mir mal in den Fingern gekribbelt.
Ich hab mich mal ein wenig in der Klassenbibliothek umgesehen und bin noch auf eine andere Idee gekommen wie man an alle nicht gefangenen Exceptions ran kommt. Ohne Reflect!
Jeder Thread ist Teil einer ThreadGroup. Und jede ThreadGroup hat eine Parent-ThreadGroup. Ausser der main-ThreadGroup.
Mit
Code:
ThreadGroup g = Thread.currentThread().getThreadGroup();
while(g.getParent() != null) {
    g = g.getParent();
}
erhält man also die main-ThreadGroup.
Mit der Methode enumerate der Klasse ThreadGroup kann man sich dann ein Array aller
Threads ausgeben lassen (auch rekursiv). Nun bleibt nur noch übrig bei allen Threads den UncaughtExceptionHandler zu setzen.
Damit hat man auch automatisch den AWT-EventDispatcher dabei und alle anderen erdenklichen Threads. Das Problem dabei ist, wenn du das zu Beginn des Programms machst, dass dann noch nicht alle Threads überhaupt existieren. Du müsstest diese Aktion also jede Minute oder so wiederholen und natürlich auch den DefaultUncaughtExceptionHandler in der Klasse Thread setzen.


Das wäre die absolute Hardcore Methode um wirklich alles abzufangen. Ob man wirklich so weit gehen sollte ist eine andere Frage, da einige Threads ja auch einen UncaughtExceptionHandler haben. Von daher sollte man evtl. vor dem setzen des UEH überprüfen ob nicht schon einer gesetzt ist.
 
Zuletzt bearbeitet:
ui ... das muss ich mir mal angucken.
Aber hast recht, das wäre echt der absolute Overkill. Ob sinnvoll ? Fraglich ^^
 
Okay, neue idee:

Wenn eine Exception oder ein Error auftritt, ist dieses in der Console zu sehen, in Eclipse wird dies ja auch angezeigt, also muss ich diesen ja eigentlich nur abfangen und dann wiedergeben...

Hab sowas noch nie gemacht, aber naja muss ich dann mal morgen schaun... oder hat hier jemand schonmal sowas gemacht?
 

Neue Beiträge

Zurück