try and catch block in finally

nieselfriem

Bekanntes Mitglied
Hallo!

Ist es möglich i einem finally-Block wieder ein try and catch-Block einzufügen. für z.B. Dateioperation

Java:
try {
  Dateileseoperation
}catch(IoException ioex) {
ioex.printStackTrace()
}finally {
 //Wenn das lesen der Datei nicht funktioniert hat
 //neue Datei erstellen
  try {
    Dateischreiboperaation
  }catch (IoException ioex)  {
      ioex.printStackTrace()

  }

Oder gibt es da einen besseren Weg?

Gruß niesel
 
Jop ist möglich - TCFTC (try-catch-finally-try-catch) 😀
Wenn du z.B. ein close() (was normal auch in ein try-catch muss) im finally machen willst, musst du das sogar.
Allerdings sind deine Kommentare etwas verwirrend für mich...
 
Hm - ich meine die Komentare zu verstehen--

Es wird versucht eine Datei zu lesen.
Wenn es dabei eine Exception gibt, wird eine Datei erstellt (Aber das muss im catch nicht im finally sein!)
Im finally wird dann geschrieben.

Stell dir vor du versuchst die Datei auf einem Pfad zu lesen den es nicht gibt.
Dann kannst du auch keine Datei erstellen weil es ja den Pfad nicht gibt

Es gibt die Möglichkeit abzufragen ob eine Datei exsistiert - bzw ob der Pfad exisitert aber auswendig weiss ich nicht wie.

So sehe ich das ...

Java:
public class Test3 {

	private static void dateiLeseOperation() throws IOException {}
	private static void dateiSchreibOperation() throws IOException {}
	private static void dateiSchliessOperation() throws IOException {}

	public static void main(String[] args) {
		try {
			dateiLeseOperation();
		} catch(IOException ioex) {
			// Hier muss die Datei erstellt werden!
			ioex.printStackTrace();
			try {
				dateiSchreibOperation();
			} catch(IOException ioex2) {
				// Hm - total aufgeben ist hier wohl sinnvoll
				return;
			}
		}finally {
			try {
				// weil man hier immer vorbeikommt ...
				dateiSchliessOperation();
			} catch (IOException ioex) {
				ioex.printStackTrace();
			}
		}
	}
}
 
Ja, wenn man das komplett "sauber" machen will, ist das tatsächlich sogar ziemlich kompliziert:
Java:
    public void write(File file, byte data[])
    {
        OutputStream out = null;
        try
        {
            out = new FileOutputStream(file);
            out.write(data);
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (out != null)
            {
                try
                {
                    out.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

Es gibt AFAIR irgendeinen JSR, damit das in Zukunft eher so geht, wie man sich es vielleicht wünschen würde (und wie es oft gemacht wird, wie es aber "eigentlich falsch" ist...)
Java:
    public void write(File file, byte data[])
    {
        try
        {
            OutputStream out = new FileOutputStream(file);
            out.write(data);
            out.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }


EDIT: Hab' mal FArt's Vorschlag von unten noch eingefügt. Kann ja nicht schaden 🙂
 
Zuletzt bearbeitet:
Ich bin noch ein wenig dogmatischer eingestellt als Marco13 ;-)
Ich würde auch die Exception des close nicht völlig ignorieren sondern noch loggen.
 
Joa, sicher. DA kann man ja dann wirklich nichts mehr machen, und ich wüßte auch nicht, wo das in der Praxis passieren könnte, und wo dann nicht schon vorher irgendwas auf fatalste weise abgekachelt sein müßte - aber vielleicht ist gereade das der Grund, weswegen man diesem Fall noch eine Log-Ausgabe spendieren könnte 😉
 
Es gibt AFAIR irgendeinen JSR, damit das in Zukunft eher so geht, wie man sich es vielleicht wünschen würde

In Java 7 wird es dann hoffentlich so aussehen:

Java:
try (OutputStream out = new FileOutputStream(file);)
{            
    out.write(data);
}

oder wenn man die Exception nicht deklarieren möchte:

Java:
try (OutputStream out = new FileOutputStream(file);)
{            
    out.write(data);
}
catch(IOException x) {
    throw new RuntimeException(x);
}
 
In Java 7 wird es dann hoffentlich so aussehen:

Java:
try (OutputStream out = new FileOutputStream(file);)
{            
    out.write(data);
}

oder wenn man die Exception nicht deklarieren möchte:

Java:
try (OutputStream out = new FileOutputStream(file);)
{            
    out.write(data);
}
catch(IOException x) {
    throw new RuntimeException(x);
}

Geht sogar schon ohne Java 7, mit dem Projekt lombok:
Project Lombok
@Cleanup
 

Zurück
Oben