Bilderdownload - Exception Handling

daniel_sun

Erfahrenes Mitglied
Hallo,

ich habe eine Funkion die Bilder von einer Seite läd! Funktioniert auch super:

Java:
	public void loadPicture(String u, String castId,String picId) throws IOException{
		
		
		if(u != null){
			
			File folder = new File("ressource/cast/"+ castId + "/profile");
			if(!folder.exists())folder.mkdirs();
	
				URL url = new URL(u);
				InputStream is = url.openStream();
				OutputStream os;
				os = new FileOutputStream("ressource/cast/"+ castId + "/profile/"+picId+".jpg");
				byte[] b = new byte[2048];
				int length;
	
				while ((length = is.read(b)) != -1) {
					os.write(b, 0, length);
				}
	
				is.close();
				os.close();
		}
	}

Der Aufruf erfolgt in der Funktion insertPicture(), die wiederum die Exeption von der loadPicture() weiterreicht.

Java:
		try {
			insertPicture();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("Fehler erkannt!");
//Hier steht der Rollback

		}

Wie oben schon gesagt funktioniert der Download super nur ab und an ist der Server mal überlastet oder nicht erreichbar.

Für in diesem Fall will ich eine art Rollback programmieren, der die änderungen bis zur exception rückgangig macht. Auch diesen Rollback hab ich schon programmiert und auch dieser Funktioniert "manuell" super.

Ich wollte das System nun testen, in dem ich währen der Bilderdownload läuft (sind etwa 20 Bilder) den Netzwerkstecker rausziehe. Leider tut sich dann gar nicht. Auch nach 2 Minuten springt er nicht in den Catch Block. Die zweile "Fehler erkannt" wird nie erreicht. Er wartet einfach "ewig". Müsste nicht iwann der Fehler 404 Not Found kommen?

Vorher stand in der catch auch e.printStackTrace(); Da bekam ich ab und ab mal den Fehler 503 Service Unavailable. Iwie müsst ich doch einen fehler mal provozieren können oder hab ich iwas Falsch gemacht?!
 
Wieso sollte da ein 404 kommen? 404 ist etwas, das der Server antwortet. Ohne Verbindung auch keine Antwort.

Was du suchst klingt eher nach einem timeout. benutze url.openConnection anstatt url.openStream und dann setReadTimeout der URLConnection klasse.
 
Java:
			URLConnection con = url.openConnection();
			con.setReadTimeout(100000);
			InputStream is = con.getInputStream();

Mit dieser Änderung klappts. Schon mal danke dafür :). Ein kleines Problem tritt ab und an auf und zwar das beim rollback die Datei die gerade heruntergeladen wird (und die exeption auslöst) nicht gelöscht wird. Ich denke mal weil das programm selber noch drauf zugreift. Kann man die Rechte iwie vorher entfernen so das die datei gelöscht werden kann? (so fern es daran liegt ;) )
 
Ich nehme an du musst vorher den bestehenden FileOutputStream schließen. Du müsstest das dann etwas umstrukturieren, weil du ja außen keine Referenz darauf hast.
 
Probier es doch aus und ruf zwei mal close hintereinander auf. Ich habe ewig kein Java mehr programmiert. Laut Doku wirft die close Methode potentiell eine IOException, aber das glaube ich nur bei anderen Problemen, zumal bei den anderen Methoden explizit dabei steht "In particular, an IOException is thrown if the output stream is closed." bei close aber nicht.
 
Zurück