Java wie printStackTrace einer API umgehen

JavaBeginner

Ensign
Registriert
Juli 2015
Beiträge
142
Hallo, ich stehe vor folgendem Problem:
Ich verwende momentan eine API mit welcher ich nun eine Anfrage versendne möchte, sollte der Nutzername der gesucht wird nicht existieren gibt die API eine Fehlermeldung (
Code:
java.io.IOException: Response code is 404 instead of 200. [...]
)
aus. In der API steht die catch Anweisung wie folgt:
Code:
catch (IOException | URISyntaxException e) {
				e.printStackTrace();
				return false;
}
Ich habe versucht für mich eine try/catch Abfrage zu machen um diese IOException zu umgehen und etwas auszuführen sofern der Name nicht existiert. Es ist jedoch nicht möglich das catch ausgeführt wird. Wie kann try/catch verwenden um dieses Problem zu lösen oder gibt es eine andere Lösung hierfür?

Danke.
 
Die API-Methode, die aufgerufen wird, liefert true|false und keine Exception. Insofern ist hier try/catch natürlich zwecklos. Stattdessen den Rückgabewert entsprechend verwerten.

Dass die API den Stacktrace auf die Standard-Ausgabe ausgibt, spricht nicht gerade für deren Qualität...
 
eine Exception wird nur soweit im Stack "hoch geworfen", bis sie gefangen wird oder "ganz oben" angekommen ist (also bei main beispielsweise) und in dem Fall dann damit das Programm beendet. Wenn die Exception aber nun in der Hierarchie bereits gefangen und deren Stacktrace ausgegeben wird, bevor du dran gewesen wärst, bringt ein weiteres try catch natürlich nichts.

Falls möglich würde ich von der betroffenden Klasse erben und die Methode entsprechend modifizieren.
Alternativ die Klasse selbst editieren, sofern der Sourcecode der API zur Verfügung steht. Dazu kannst du einfach die kompilierte class-Datei aus der .jar der API löschen und bei deinem eigenen Projekt dann die java-Datei von den Sources der API einfügen. Achte dabei unbedingt darauf, dass der package-Pfad der java-Datei gleich bleibt
 
Hey, danke für eure Hilfe. Da ich mir die API nun angeschaut habe und gesehen habe das er 2-3 weitere API's und diese wiederrum API's verwenden wollte ich nun fragen ob ich die Fehlermeldung die ausgegeben wird nicht "maskieren" kann? Damit einfach nichts in der Konsole steht.
 
wie du das problem loest, hat @Redirion in seinem zweiten absatz skizziert.

wenn du in die API-quellen nicht eingreifen kannst, kannst du die fehlermeldungen von dieser spezifischen stelle nicht ungetrennt von allen anderen unterdruecken. du kannst z.B. zur puren symptomunterdrueckung sowas machen:
Code:
PrintStream dummy = new PrintStream(new OutputStream() {
	public void write(int b) {
		/* diese methode wird von den anderen write()-implementationen verwendet.
		 * wir machen hier nichts; damit wird der output eliminiert
		 */
	}
});
PrintStream original = System.err;

System.err = dummy;
exceptionPrintingCode();

System.err = original;
aber das ist nicht multitasking-sicher und generell 'ne scheiss idee.
 
Geworfene Exceptions fangen und umgehen ist generell nie ne gute Idee!
Irgendwann haste den Fehler an der Stelle und brauchst Tage rauszufinden wo er herkommt!

Möglich ist es, aber es wäre sinnvoller entweder ne andere API zu nehmen, die API anzupassen oder deinen Code anders zu machen.

Da es sich hier so liest als würde die API einfach in System.out printen, nur weil der Responsecode nicht passt würde ich da mal dringend ne andere API suchen ;)
 
Noch ein allgemeiner Rat. Ich weiß nicht wie gut deine Java Kenntnisse sind. Aber aus meiner Sicht sollte man, besonders wenn man die Sprache lernen will, nicht bei jeder Möglichkeit auf eine fremde API zurückgreifen. Ich hab meine erste kleine HTTP API auch mit Java eigenen Methoden geschrieben mich um das Exception Handling etc. gekümmert. Dadurch lernt man imo mehr als sich in die Gedankengänge anderer Entwickler reinzudenken.
Klar, inzwischen nutze ich auch eine große HTTP API um asynchrone Requests abzuschicken, mich nicht um SSL Handshakes und Keep-alives und Exception jeglicher Art wie dem Parsen der URL kümmern zu müssen. Aber wenn du aktuell nur eine Abfragt nutzt, würde ich evtl versuchen diese selbst zu implementieren.
 
Zuletzt bearbeitet:
Kann es sein, dass Ihr nicht wisst was eine API wirklich ist?

​Eine API kann weder irgendwas printen noch HTTP requests durchführen...
 
Klär uns gerne etwas auf, auch wenn ich denke zu wissen inwiefern du die Wahl der Begriffe kritisierst.:)

Mit meinem evtl. nicht ganz korrekt verwendeten Ausdruck "HTTP API" meine ich eher einen HTTP Client der Methoden für HTTP Requests zu einer bestimmten API in einer konkreten Programmiersprache abbildet.

Und das kommt eher davon, das ich genau das aus dem ersten Post unter seinem Begriff "API" verstanden habe. Diese handelt ja anscheinend Java Exceptions.:D
 
Zuletzt bearbeitet:
Eine API ist wie der Begriff schon sagt eine Schnittstelle und eine Schnittstelle macht aktiv "gar nichts", sondern ermöglicht nur eine fest definierte Kommunikation mit diversen Objekten.

​Man kann Objekte über eine/ein API ansprechen. Diese machen dann Dinge.
Schon mal ein Interface gesehen in Java/C#, das printen kann?
 
The Ripper schrieb:
Eine API ist wie der Begriff schon sagt eine Schnittstelle und eine Schnittstelle macht aktiv "gar nichts", sondern ermöglicht nur eine fest definierte Kommunikation mit diversen Objekten.
Okay, kann man so natürlich ausdrücken. Nur denke hier gehts ja eher um den Fall, den ich zuvor erwähnt habe. Eine API definiert so gesehen ja auch, was passiert wenn die Kommunikation fehlschlägt oder unzulässig ist. Eine Anfrage auf ein Objekt auf das man keinen Zugriff hat zB. Natürlich printet die API keinen Stack-Trace in der jeweiligen Programmierumgebung, aber eine definierte Rückmeldung muss es in diesem Fall geben.

Du hast vollkommen Recht, was der TE hier beschreibt ist eher ein Wrapper einer bestimmten API. Denke mit dem Begriff kommen wir auf einen Nenner?:D
 
Zuletzt bearbeitet:
okay interessant, dass das in Java möglich ist. Neuerdings.

​Aber basierend auf den ;) Smiley vermute ich mal, dass trotzdem verstanden wurde, auf was ich hinaus wollte.
 

Ähnliche Themen

Antworten
3
Aufrufe
1.245
VikingGe
V
Zurück
Oben