2010-07-29 10 views
8

Gibt es eine Möglichkeit, programmatisch zu unterscheiden, was eine IOException verursachte? Zum Beispiel wird Java eine IOException auslösen, wenn beim Schreiben ein Fehler aufgetreten ist. Wie kann ich feststellen, ob es etwas wie Zugriffsverletzung ist, wenn die Festplatte keinen freien Speicherplatz mehr hat, wenn jemand das Netzwerklaufwerk oder andere Dinge getrennt hat.Programmatische Ermittlung der Ursache für IOException?

Ich kann die Nachricht nicht wirklich parsen, da es kein standardisiertes Nachrichtenformat zu geben scheint, scheint Sun (oder oracle jetzt, ich denke) kein standardisiertes Format zu haben.

Irgendwelche Vorschläge (Ich bin ziemlich neu in Java, es ist nicht meine normale Sprache, aber ich brauche, um es zu verwenden, um ein sehr gebrochenes System bei der Arbeit zu beheben.)

Antwort

5

Leider Java hat keine Entsprechung von .NET ist System.Runtime.InteropServices.Marshal.GetHRForException(). Sie sagen, welche Art von E/A-Fehler es nur war, wenn die Ausnahme eine Instanz einer Unterklasse ist, z. FileNotFoundException.

+0

Es könnte nicht sein, was ich hören wollte = (aber Sie haben mir geantwortet. – UberJumper

0

Wenn Sie die genaue Klasse der Exception erhalten, erhalten Sie eine der wenigen möglichen Unterklassen von IOException, die ziemlich standardisiert sind. Sie können entweder Klassen mit instanceof testen oder (ein brutaler Ansatz) vergleichen Strings zurückgegeben von getClass().getName().

Es gibt einige Problemumgehungen für die anderen Sachen; Du kannst eine File.canWrite() für eine Datei schreiben, die du zum Schreiben öffnen willst (nun, dein Programm hätte das sowieso machen sollen, wenn der Name und/oder das Verzeichnis variieren könnte), und wenn du die Möglichkeit hast, keinen Dateispeicher mehr zu haben, Sie könnten versuchen, eine kleine Datei an einen bekannten guten Ort zu schreiben und zu sehen, ob das bei Ihnen explodiert. Nicht sehr elegant, ich weiß: Java ist nicht wirklich als Systemprogrammiersprache bekannt.

Auf der anderen Seite, sehr oft eine detaillierte Ursache für eine Ausnahme wissen hilft nicht viel: Mit oder ohne das Wissen, kann Ihr Benutzer einfach nicht in der Lage sein, das Programm zu tun, was benötigt wird.

+3

Eine mögliche Ergänzung zu Ihrem ersten Absatz - normalerweise "fangen" Sie diese Ausnahmen, so ist eine bessere Alternative, separate fangen zu haben Blöcke für 'FileNotFoundException',' UnknownHostException' usw. Es vermeidet "explizite" Tests und lässt Sie die Sonderfälle in verschiedenen Blöcken von Anfang an behandeln (ohne einen catch-all 'catch (IOException e)' Block am Ende auszuschließen) –

+0

@Ahdrzej: Du hast recht, ich habe über Band-Fixes nach bereits existierendem Coding nachgedacht und angenommen, dass uberjumper die bestehenden Fang-Hierarchien (was auch immer es sein mag) nicht neu arrangieren will Es ist eine Option, dann wäre es dein Weg. –

Verwandte Themen