Eine Ausnahme ist ein Fall, der während der Durchführung eines Programms auftritt, das den normalen Fluß der Anweisungen des Programms stört.
Ausnahmen liefern die Mittel, die Details von was zu trennen zu tun, wenn etwas aus dem Üblichen heraus von der MAIN LOGIC eines Programms geschieht. In der traditionellen Programmierung führen Fehlererkennung, der Bericht und die Behandlung häufig zu verwirrenden Isolationsschlauchcode. Z.B. betrachten Sie die Pseudocodemethode hier, die eine gesamte Akte in Gedächtnis liest:
readFile {
öffnen Sie die Akte;
stellen Sie seine Größe fest;
teilen Sie daß viel Gedächtnis zu;
lesen Sie die Akte in Gedächtnis;
schließen Sie die Akte;
}
Am ersten flüchtigen Blick scheint diese Funktion genug einfach, aber sie ignoriert alle folgenden möglichen Störungen:
|
|
• Was geschieht, wenn die Akte nicht geöffnet werden kann?
• Was geschieht, wenn die Länge der Akte nicht festgestellt
werden kann?
• Was geschieht, wenn genügend Gedächtnis nicht zugeteilt werden
kann?
• Was geschieht, wenn gelesen ausfällt?
• Was geschieht, wenn die Akte nicht geschlossen sein kann?
Um solche Fälle anzufassen, muß die readFile Funktion mehr Code haben zum der Fehlererkennung zu tun und berichten und anfassen. Wie hier ist ein Beispiel von, was die Funktion aussehen konnte:
errorCodeType readFile {
initialisieren Sie errorCode = 0;
öffnen Sie die Akte;
wenn (theFileIsOpen) {
stellen Sie die Länge der Akte fest;
wenn (gotTheFileLength) {
teilen Sie daß viel Gedächtnis zu;
wenn (gotEnoughMemory) {
lesen Sie die Akte in Gedächtnis;
wenn (readFailed) {
errorCode = -1;
}
} sonst {
errorCode = -2;
}
} sonst {
errorCode = -3;
}
schließen Sie die Akte;
wenn (theFileDidntClose && errorCode == 0) {
errorCode = -4;
} sonst {
errorCode = errorCode und -4;
}
} sonst {
errorCode = -5;
}
RückholerrorCode;
}
Es gibt soviel die Fehlererkennung und berichtet, und hier geht zurück, daß die ursprünglichen sieben Linien des Codes in der Unordnung verloren sind. Schlechter schon, ist der logische Fluß des Codes auch verloren worden und ihn schwierig so gebildet zu erklären, ob der Code die rechte Sache tut: Wird die Akte wirklich geschlossen gewesen, wenn die Funktion genügend Gedächtnis zuteilen nicht kann? Es ist sogar schwieriger, sicherzugehen, daß der Code fortfährt, die rechte Sache zu tun, wenn Sie die Methode drei Monate nach Schreiben es ändern. Viele Programmierer lösen dieses Problem, indem sie einfach iterrors ignorieren, werden berichtet, wenn ihre Programme zusammenstoßen.
Ausnahmen ermöglichen Ihnen, den Hauptfluß Ihres Codes zu schreiben und die Sonderfälle anderwohin zu beschäftigen. Wenn die readFile Funktion Ausnahmen anstelle von den traditionellen Störung-Management Techniken verwendete, würde sie mehr wie das folgende schauen:
readFile {
Versuch {
öffnen Sie die Akte;
stellen Sie seine Größe fest;
teilen Sie daß viel Gedächtnis zu;
lesen Sie die Akte in Gedächtnis;
schließen Sie die Akte;
} Verriegelung (fileOpenFailed) {
DoSomething;
} Verriegelung (sizeDeterminationFailed) {
DoSomething;
} Verriegelung (memoryAllocationFailed) {
DoSomething;
} Verriegelung (readFailed) {
DoSomething;
} Verriegelung (fileCloseFailed) {
DoSomething;
}
}
Merken Sie, daß Ausnahmen Ihnen nicht die Bemühung des Erledigens der Arbeit des Ermittelns, des Berichtens und der Behandlung über von von Störungen ersparen, aber sie helfen Ihnen, die Arbeit effektiv zu organisieren.
Ein zweiter Vorteil von Ausnahmen ist die Fähigkeit, die Störung fortzupflanzen, die herauf den Anrufstapel von Methoden berichtet. Nehmen Sie an, daß die readFile Methode die vierte Methode in einer Reihe von den genisteten Methode Anrufen ist, die durch das Hauptprogramm gebildet werden: method1 benennt method2, das method3 benennt, das schließlich readFile benennt:
method1 {
Anruf method2;
}
method2 {
Anruf method3;
}
method3 {
Anruf readFile;
}
Nehmen Sie auch an, daß method1 die einzige Methode ist, die an den Störungen interessiert wird, die innerhalb readFile. der traditionellen Störung-Mitteilung Technikkraft method2 und method3 auftreten konnten, zum der Störung Codes fortzupflanzen, die durch readFile hohes der Anrufstapel zurückgebracht wurden, bis die Störung Codes schließlich method1the nur Methode erreichen, die an ihnen interessiert ist:
method1 {
errorCodeType Störung;
Störung = Anruf method2;
wenn (Störung)
DoErrorProcessing;
sonst
fahren Sie fort;
}
errorCodeType method2 {
errorCodeType Störung;
Störung = Anruf method3;
wenn (Störung)
Rückholstörung;
sonst
fahren Sie fort;
}
errorCodeType method3 {
errorCodeType Störung;
Störung = Anruf readFile;
wenn (Störung)
Rückholstörung;
sonst
fahren Sie fort;
}
Rufen Sie zurück, daß das Java Laufzeitklima rückwärts durch den Anrufstapel sucht, um alle mögliche Methoden zu finden, die interessiert sind, an, eine bestimmte Ausnahme anzufassen. Eine Methode kann alle mögliche Ausnahmen ducken, die innerhalb sie geworfen werden, dadurch sieläßt sieläßt eine Methode weit herauf den Anrufstapel sich ihn verfangen. Folglich nur die Methoden, die für Störungen sich interessieren, müssen um das Ermitteln von von Störungen sich sorgen:
method1 {
Versuch {
Anruf method2;
} Verriegelung (Ausnahme e) {
DoErrorProcessing;
}
}
method2 wirft Ausnahme {
Anruf method3;
}
method3 wirft Ausnahme {
Anruf readFile;
}
Jedoch während der Pseudocode darstellt, erfordert das Ducken einer Ausnahme etwas Bemühung von seiten der Zwischenhändlermethoden. Alle mögliche überprüften Ausnahmen, die innerhalb einer Methode geworfen werden können, müssen in seiner THRowsklausel spezifiziert werden.
Weil alle Ausnahmen, die innerhalb eines Programms geworfen werden, Gegenstände sind, ist die Gruppierung oder das Kategorisieren von Ausnahmen ein natürliches Resultat der Kategorie Hierarchie. Ein Beispiel einer Gruppe in Verbindung stehender Ausnahmekategorien in der Java Plattform sind die definiert in java.ioIOException und in seinen Nachkommen. IOException ist das allgemeinste und stellt irgendeine Art Störung dar, die auftreten kann, wenn es I/O durchführt. Seine Nachkommen stellen spezifischere Störungen dar. Z.B. bedeutet FileNotFoundException, daß eine Akte nicht auf Scheibe sich befinden könnte.
Eine Methode kann spezifische Zufuhren schreiben, die eine sehr spezifische Ausnahme anfassen können. Die FileNotFoundException Kategorie hat keine Nachkommen, also kann die folgende Zufuhr nur eine Art Ausnahme anfassen:
Verriegelung (FileNotFoundException e) {
...
}
Eine Methode kann eine Ausnahme sich verfangen, die auf seiner Gruppe oder allgemeinen Art, indem sie irgendwelche der superclasses der Ausnahme in der Verriegelung Aussage basiert spezifiziert. Z.B. um sich alle I/O Ausnahmen, unabhängig davon ihre spezifische Art zu verfangen, spezifiziert eine Ausnahmezufuhr ein IOException Argument:
Verriegelung (IOException e) {
...
}
Diese ZufuhrIST in der Lage, sich alle I/O Ausnahmen, einschließlich FileNotFoundException, EOFException zu verfangen und so weiter. Sie können finden Details über, was auftrat, indem es das Argument fragte, das der Ausnahmezufuhr geführt wird. Z.B. verwenden Sie das folgende, um das Kellerprotokoll zu drucken:
verfangen Sie sich (IOException e) {
e.printStackTrace(); //ausgegeben geht zu
System.err.
e.printStackTrace(System.out); //schicken Sie Spur zum
stdout.
}
Sie konnten eine Ausnahmezufuhr sogar aufstellen, die jede mögliche Ausnahme mit der Zufuhr hier anfaßt:
verfangen Sie sich (Ausnahme e) {// A (auch) allgemeine
Ausnahmezufuhr
...
}
Die Ausnahmekategorie ist nah an der Oberseite der THRowable Kategorie Hierarchie. Folglich verfängt sich diese Zufuhr viele andere Ausnahmen zusätzlich zu denen, die die Zufuhr sich verfangen soll. Sie können Ausnahmen anfassen wünschen auf diese Weise, wenn alle Sie Ihr Programm tun wünschen, z.B. Druck aus einer Fehlermeldung für den Benutzer ist und dann herausnimmt.
In den meisten Situationen jedoch wünschen Sie Ausnahmezufuhren so spezifisch sein, wie möglich. Der Grund ist, daß die erste Sache, die ein Zufuhrmuß, feststellen ist, welche Art der Ausnahme auftrat, bevor sie auf der besten Wiederaufnahme Strategie entscheiden kann. In Wirklichkeit indem er sich nicht spezifische Störungen verfängt, muß die Zufuhr jede mögliche Möglichkeit unterbringen. Ausnahmezufuhren, die zu allgemeine Dose sind, bilden Code fehleranfälliger, indem sie Ausnahmen sich verfangen und anfassen, die nicht vom Programmierer vorweggenommen wurden und für, welches der Zufuhr nicht beabsichtigt wurde.
Wie gemerkt, können Sie Gruppen Ausnahmen verursachen und
Ausnahmen auf eine allgemeine Art und Weise anfassen, oder Sie können
die spezifische Ausnahmeart benutzen, um Ausnahmen zu unterscheiden
und Ausnahmen auf eine genaue Art und Weise anzufassen.
Online: 707 users browsing the articles directory
|
|