Erste Schritte Eigene Fehlermeldungen bei Exceptions

Inf.-Student

Mitglied
Hallo.
Ich habe ein kleines Programm zum Herunterladen von Textdokumenten geschrieben, das eigentlich ganz gut funktioniert. Bloß mit Fehlermeldungen bin ich nicht zufrieden.
Zurzeit gebe ich einfach
Code:
Exception.toString()
aus. Die Fehlermeldungen sehen ungefähr so aus:
java.net.UnknownHostException: example.com
Stattdessen hätte ich gerne:
Host unbekannt: example.com
Das Problem ist, dass ich keine genaue Liste der möglichen Exceptions habe. In der Dokumentation von
Code:
HttpURLConnection
ist nur
Code:
IOException
angegeben.

Kann ich da etwas machen?

Hier mein Code:
Java:
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;

public class Download {
	public static void main(String[] args) {
		String dlUrl, dlText;
		
		if (args.length > 0) { //Kommandozeilenparameter angegeben
			dlUrl = args[0];
		} else { //Keine Kommandozeilenparameter, frage nach
			System.out.println("Bitte URL eingeben:");
			Scanner inStrSc = new Scanner(System.in);
			dlUrl = inStrSc.next();
		}
		
		System.out.println("Lade: " + dlUrl); //Nochmal die Adresse
		
		try {
			dlText = download(dlUrl); //herunterladen
			
			System.out.println();
			System.out.println(dlText); //ausgeben
			System.out.println();
		} catch (IOException e) {
			System.err.println(e.toString()); //Fehlermeldung
		}
	}
	
	private static String download(String address) throws IOException {
		URL url = new URL(address);
		
		HttpURLConnection con = (HttpURLConnection) url.openConnection();
		con.setDoInput(true);
		
		InputStream inStr = con.getInputStream();
		
		int b;
		StringBuffer buffer = new StringBuffer();
		
		while ((b = inStr.read()) != -1)
			buffer.append((char) b);
		
		return buffer.toString();
	}
}
 
Zuletzt bearbeitet:
Vermutlich suchst du
Code:
getMessage()
von [JAPI]Throwable[/JAPI], aber wieso sollte man sowas wollen?
 
aber wieso sollte man sowas wollen?
Ich möchte, dass mein Programm Fehlermeldungen ohne unnötigen Kauderwelsch wie Package- und Klassennamen und am besten auf Deutsch ausgibt.

Vermutlich suchst du
Code:
getMessage()
von [JAPI]Throwable[/JAPI]
Nein, die bringt mir leider nichts. Bei einigen Exceptions, wie z. B.
Code:
UnknownHostException
oben, sind diese Messages alleine nicht aussagekräftig.
 
Entferne zunächst das
Code:
throws IOException
der Methode. Dann verrät eclipse dir welche Exceptions wo geworfen werden. Die kannst du dann verarbeiten.

Alternativ: in die API schaun.
 
Dann hast du vermutlich noch throws IOException im Methodenkopf stehen.
Eclipse sagt dir dann z.b. dass der Konstruktor von URL eine MalformedURLException werfen kann.

Du kannst in der API schauen welche Befehle welche Exception werfern.
Z.b.: URL (Java Platform SE 6)

Du hast recht. Leider sagt mir eclipse nicht, dass z. B. java.net.URLConnection.getInputStream() UnknownHostException werfen kann. Auch in der API steht das nicht.
Ich bin mir gar nicht sicher, ob ich diese Exception dann explizit abfangen darf, wenn sie nirgendwo dokumentiert ist.

PS
Jetzt, wo ich es mir genau anschaue, eclipse meckert seltsamerweise gar nicht über UnknownServiceException. Hat das vielleicht etwas damit zu tun, dass ich openjdk6 verwende?
 
Aber die API sagt dir, dass UnknownHostException von IOException abgeleitet wird
Sicher, aber ich verspüre jetzt nicht unbedingt einen großen Drang, jede von IOException abgeleitete Exception abzufangen, wo sie vielleicht gar nicht geworfen wird.

Das wäre ja an sich möglich, aber ich muss dann noch für jede Exception eine Fehlermeldung schreiben.
 
Dann beschränk dich drauf da ne IOException zu fangen und gib ne entsprechende Meldung an den User raus.
 
Das wäre ja an sich möglich, aber ich muss dann noch für jede Exception eine Fehlermeldung schreiben.
Ja aber das ist doch das, was du wolltest? Also entweder du sparst dir die Arbeit und sagst dem User "Fehler!", oder du gibts ne genaue Meldung aus, dann musst du das im Code auch unterscheiden. Entscheid dich 😉
 
Dann beschränk dich drauf da ne IOException zu fangen und gib ne entsprechende Meldung an den User raus.
Und wie soll die entsprechende Meldung aussehen? IOException wird geworfen z. B. wenn keine Verbindung zur Website oder auch wenn 404 HTTP Status Code vom Server geschickt wird oder wenn Timer abgelaufen ist. Ich würde gerne unterschiedliche Fehlermeldungen für unterschiedliche Fehler haben.
 
Zuletzt bearbeitet:
Und wie soll die entsprechende Meldung aussehen?
"Ein Fehler ist aufgetreten, bitten wenden Sie sich an xy"
Den kompletten Stacktrace kannst du dann in ein Log file schreiben dass sich der Administrator anschauen kann.
 
Ich würde gerne unterschiedliche Fehlermeldungen für unterschiedliche Fehler haben.
Nochmal: Wenn dir die Message, die sich die Leute von Sun für die Exception ausgedacht haben, nicht ausreicht, dann kommst du nicht drumherum jede einzelne Exception abzufangen und einen eigenen Text rauszuhauen. Natürlich kannst du dir dafür eigene Exceptions und Hilfsklassen schreiben, um die das Handling an verschiedenen Stellen im Programm zu erleichtern. Aber irgendwo musst du das halt tun.
 
"Ein Fehler ist aufgetreten, bitten wenden Sie sich an xy"
Den kompletten Stacktrace kannst du dann in ein Log file schreiben dass sich der Administrator anschauen kann.

Also stell dir bitte einen Browser vor (als Beispiel für ein Programm, das Text über HTTP herunterlädt).
Es wäre doch etwas seltsam, wenn das Ding dich bei jedem 404-Fehler zum Administrator schicken würde.
 
Nochmal: Wenn dir die Message, die sich die Leute von Sun für die Exception ausgedacht haben, nicht ausreicht, dann kommst du nicht drumherum jede einzelne Exception abzufangen und einen eigenen Text rauszuhauen. Natürlich kannst du dir dafür eigene Exceptions und Hilfsklassen schreiben, um die das Handling an verschiedenen Stellen im Programm zu erleichtern. Aber irgendwo musst du das halt tun.

Es gibt keine Beschreibung, welche Exceptions bei welchen Fehlern geworfen werden. Raten dürfte etwas schwierig werden.
 
In deiner Java installation müsste es einen src.zip Datei geben, die kannst du z.b. in Eclipse einbinden.
 
Es gibt auch Throwable#getLocalizedMessage, dann is die Nachricht manchmal schon übersetzt. Aber mal ehrlich: Wenn ich so genaues Fehlerhandling für HTTP haben will, dann benutz ich nicht URL sondern z.B. Apache HTTPClient.
 

Zurück
Oben