Wohin mit der Fehlerbehandlung?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!

habe eine Methode geschrieben, mir der ich eine Textdatei auslese:

Code:
public static String readFile(String filename) {
		StringBuffer sb = new StringBuffer();
		String line;
		BufferedReader br;
		try {
			br = new BufferedReader(new java.io.FileReader(filename));
			while ((line = br.readLine()) != null)
				sb.append(line).append("\n");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "Datei nicht gefunden",
					"Fehler", JOptionPane.ERROR_MESSAGE);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "IO-Exception", "Fehler",
					JOptionPane.ERROR_MESSAGE);
		}
		return sb.toString();
	}


In einer anderen wird auf diese zugegriffen, um noch ein paar Parameter zu ergänzen, da damit speziell Sql-Anfragen ausgelesen werden sollen:

Code:
public static String getSqlQuery(String Name) {
		String ausgabe;
		ausgabe = readFile(getQueryPfad() + Name + ".sql");
		return ausgabe;
	}

Wenn die Datei beispielsweise nicht gefunden wird, ist es sinnvoll, oben bei readFile die Meldung ausgeben zu lassen oder unten in getSqlQuery ?

Man könnte ja bei der readFile Deklaration noch das throws FileNotFount... ergänzen, dann müsste ich es in der anderen Methode nochmal behandeln.

Mein Problem ist nun, dass ich nicht weiß, wohin genau mit der Fehlermeldung, will mir ja Mehraufwand ersparen. Und ich weiß nicht, wie es am praktischten ist.

Viele Danke schonmal!
Gruß, Andy :roll:
 

Ark

Top Contributor
Tja, das kommt ganz darauf an, wie sich der Fehler bemerkbar machen soll bzw. wo es möglich ist, Fehler zu ignorieren. Spontan würde ich bei beiden Methoden throws notieren, dann muss eben der Aufrufer auf die Exception reagieren. Die Exception muss aber irgendwann abgefangen werden, sonst stürzt Dir das Programm (oder ein Teil davon) ab, Arbeit kannst Du Dir also nicht ersparen.

Du musst einfach die Exception so lange nach oben weiterreichen, bis sie behandelt werden kann — auch wenn dem Benutzer mitgeteilt werden muss, dass er dieses Programm nicht richtig bedienen kann. :lol:

Ark
 

André Uhres

Top Contributor
Man sollte auf jeden Fall sicher sein, daß nix falsch gelaufen ist bevor man die Daten weiterverarbeitet.
Das kann man von deiner Version wohl nicht behaupten: das Programm läuft im Fehlerfall einfach weiter,
nachdem man die Fehlermeldung bestätigt hat.
Es wäre ausserdem günstig, wenn man auch noch den "close" vom Reader unterbringen könnte.
Wie man das alles im Einzelnen gestaltet, bleibt der Fantasie des Entwicklers überlassen:
Code:
...
        StringBuffer str = new StringBuffer();
        if(readFile("c:\\album.txt", str) == 0){
            System.out.println(str);
        }
...
    public static int readFile(final String filename, final StringBuffer resultString) {
        BufferedReader br = null;
        int resultCode = 0;
        try {
            br = new BufferedReader(new java.io.FileReader(filename));
            try {
                readAll(br, resultString);
            } catch (IOException ex) {
                resultCode = 1;
            }
        } catch (FileNotFoundException e) {
            resultCode = 2;
        }
        return resultCode;
    }
    private static StringBuffer readAll(final BufferedReader reader, final StringBuffer resultString) throws IOException{
        String line;
        try{
            while ((line = reader.readLine()) != null){
                resultString.append(line).append("\n");
            }
        }finally{
            reader.close();
        }
        return resultString;
    }
...
 

sunnyandy

Mitglied
Hallo,

danke für eure Antworten!
Vielleicht habe ich die Frage etwas undeutlich formuliert:
Meine readFile-Methode möchte ich von unterschiedlichen Orten aus aufrufen, und wenn die Datei nicht gefunden wurde, dann soll jedesmal die gleiche Fehlermeldung erscheinen.
Deswegen ist es doch sinnvoll, die Fehlermeldung in der readFile-Methode auszugeben, sonst müsste ich sie bei jedem Aufruf dieser Methode eingeben oder?

Habe es noch einmal verändert:
Code:
public static String readFile(String filename) throws IOException {
		StringBuffer sb = new StringBuffer();
		String line;
		BufferedReader br;
		try {
			br = new BufferedReader(new java.io.FileReader(filename));
			while ((line = br.readLine()) != null)
				sb.append(line).append("\n");
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Datei nicht gefunden",
					"Fehler", JOptionPane.ERROR_MESSAGE);
			throw new FileNotFoundException();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			JOptionPane.showMessageDialog(null, "IO-Exception", "Fehler",
					JOptionPane.ERROR_MESSAGE);
			throw new IOException();
		}
		return sb.toString();
	}

Damit gebe ich eine Fehlermeldung aus und werfe eine Exception.

Und die Methode, mit der ich die obige aufrufe, habe ich auch geändert:
Code:
public static String getSqlQuery(String Name) throws IOException {
		String ausgabe;
		try {
			ausgabe = readFile(getQueryPfad() + Name + ".sql");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new IOException();
		}
		return ausgabe;
	}

Wenn ich diese Methode dann verwende, muss ich allerdings im Aufruf wieder ein try-catch machen...
Code:
try {
			Statement st = connection.createStatement();
			st.execute(getSqlQuery("test"));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
                // Diese Exception hier unten!
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

Ist das denn so richtig, oder mache ich es zu kompliziert?
 

André Uhres

Top Contributor
sunnyandy hat gesagt.:
..Meine readFile-Methode möchte ich von unterschiedlichen Orten aus aufrufen,
und wenn die Datei nicht gefunden wurde, dann soll jedesmal die gleiche Fehlermeldung erscheinen.
Deswegen ist es doch sinnvoll, die Fehlermeldung in der readFile-Methode auszugeben,
sonst müsste ich sie bei jedem Aufruf dieser Methode eingeben oder?..
In meinem Beispiel hab ich einfach nur auf die Fehlermeldungen verzichtet. Die kann man einbauen wo immer man will.
Für deinen Zweck würdest du sie in den entsprechenden "catch"-Block tun, ohne danach noch mehr Exceptions werfen zu müssen.
Zu viele Exceptions führen schnell zu kompliziertem Code.
 

sunnyandy

Mitglied
André Uhres hat gesagt.:
Das kann man von deiner Version wohl nicht behaupten: das Programm läuft im Fehlerfall einfach weiter,
nachdem man die Fehlermeldung bestätigt hat.

Wie kann ich denn in meinem Code (der erste von ganz oben) das Programm unterbrechen in der readFile-Methode, ohne die Exception wieder weiterzugeben, dass der Code so unnötig kompliziert wird?

Ich meine also diese Codestellte:
Code:
 try {
         br = new BufferedReader(new java.io.FileReader(filename));
         while ((line = br.readLine()) != null)
            sb.append(line).append("\n");
      } catch (FileNotFoundException e) {
         // TODO Auto-generated catch block
         JOptionPane.showMessageDialog(null, "Datei nicht gefunden",
               "Fehler", JOptionPane.ERROR_MESSAGE);
      } catch (IOException e) {
         // TODO Auto-generated catch block
         JOptionPane.showMessageDialog(null, "IO-Exception", "Fehler",
               JOptionPane.ERROR_MESSAGE);
      }
      return sb.toString();
Ich gebe die Meldung aus und will das Programm dort unterbrechen. Wie mache ich das?
 

André Uhres

Top Contributor
sunnyandy hat gesagt.:
..Ich gebe die Meldung aus und will das Programm dort unterbrechen. Wie mache ich das?
In meinem Beispiel hab ich das mit dem "resultCode" gemacht. Wenn er ungleich 0 ist, werden keine Daten verarbeitet.
Es gibt wahrscheinlich keine "beste" Lösung. Aber ich denke, daß das Beipiel leicht zu verstehen ist.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben