Das Ausnahme-Berühren

Das Ausnahme-Berühren ist der Prozess der Reaktion zum Ereignis, während der Berechnung, von Ausnahmen - anomalen oder außergewöhnlichen Situationen, die spezielle Verarbeitung - häufig das Ändern des normalen Flusses der Programm-Ausführung verlangen. Es wird durch Spezialprogrammiersprache-Konstruktionen oder Computerhardware-Mechanismen zur Verfügung gestellt.

Im Allgemeinen wird eine Ausnahme (aufgelöst) durch das Sparen des aktuellen Staates der Ausführung in einem vorherbestimmten Platz und die Schaltung der Ausführung zu einem spezifischen als ein Ausnahme-Dressierer bekannten Unterprogramm behandelt. Wenn Ausnahmen continuable sind, kann der Dressierer später die Ausführung an der ursprünglichen Position mit der gesparten Information fortsetzen. Zum Beispiel, ein Schwimmpunkt teilen sich durch die Nullausnahme wird normalerweise standardmäßig dem Programm erlauben, fortgesetzt zu werden, während aus der Speicherbedingung durchsichtig nicht auflösbar sein könnte.

Alternative Annäherungen an die Ausnahme, die in der Software behandelt, sind Fehlerüberprüfung, die normalen Programm-Fluss mit späteren ausführlichen Kontrollen für Eventualitäten, mit zurückgegebenen Werten oder einer globalen Hilfsvariable wie C aufrechterhält; oder Eingangsgültigkeitserklärung.

Ausnahme, die in der Software behandelt

In Programmiersprache-Mechanismen für das Ausnahme-Berühren wird der Begriff Ausnahme normalerweise in einem spezifischen Sinn gebraucht, eine Datenstruktur-Speicherungsinformation über eine außergewöhnliche Bedingung anzuzeigen. Ein Mechanismus, Kontrolle zu übertragen, oder eine Ausnahme zu erheben, ist als ein Werfen bekannt. Wie man sagt, wird die Ausnahme geworfen. Ausführung wird einem "Fang" übertragen.

Aus dem Gesichtswinkel vom Autor einer Routine, eine Ausnahme erhebend, ist eine nützliche Weise Zeichen zu geben, dass eine Routine normalerweise - zum Beispiel nicht durchführen konnte, wenn ein Eingangsargument ungültig ist (z.B, ist Wert außerhalb des Gebiets einer Funktion), oder wenn eine Quelle, auf die es sich verlässt (wie eine fehlende Datei, ein Festplatte-Fehler oder Fehler aus dem Gedächtnis) nicht verfügbar ist. In Systemen ohne Ausnahmen würden Routinen einen speziellen Fehlercode zurückgeben müssen. Jedoch wird das manchmal durch das Halbprädikat-Problem, in der Benutzer des alltäglichen Bedürfnisses kompliziert, Extracode zu schreiben, um normale Rückwerte von falschen zu unterscheiden.

Ausnahme-Berühren-Mechanismen auf zeitgenössischen Sprachen sind normalerweise non-resumable ("Beendigungssemantik") im Vergleich mit Hardware-Ausnahmen, die normalerweise resumable sind. Auf dem Grundprinzip für solch ein Design für den C ++ Mechanismus bemerkt Stroustrup:

"An der Palo Altstimme [C ++ Standardisierung], sich im November 1991 treffend, haben wir eine hervorragende Zusammenfassung der Argumente für die Beendigungssemantik gehört, die sowohl mit der persönlichen Erfahrung als auch mit den Daten von Jim Mitchell (von der Sonne, früher von Xerox PARC) unterstützt ist. Jim hatte Ausnahme verwendet, die entzwei ein Dutzend Sprachen über eine Zeitdauer von 20 Jahren behandelt, und war ein früher Befürworter der Wiederaufnahme-Semantik als einer der Hauptentwerfer und implementers des Cedar/Mesa Systems von Xerox. Seine Nachricht war Beendigung wird über die Wiederaufnahme bevorzugt; das ist nicht eine Sache der Meinung, aber eine Sache von Jahren der Erfahrung. Wiederaufnahme ist verführerisch, aber nicht gültig. Er hat diese Behauptung mit der Erfahrung von mehreren Betriebssystemen unterstützt. Das Schlüsselbeispiel war Cedar/Mesa: Es wurde von Leuten geschrieben, die gemocht haben und Wiederaufnahme, aber nach zehn Jahren des Gebrauches verwendet haben, gab es nur einen Gebrauch der Wiederaufnahme, die in der Hälfte der Million Leitungssystem verlassen ist - und das war eine Zusammenhang-Untersuchung. Weil Wiederaufnahme für solch eine Zusammenhang-Untersuchung nicht wirklich notwendig war, haben sie es entfernt und haben eine bedeutende Geschwindigkeitszunahme in diesem Teil des Systems gefunden. In all und jedem Fall, wo Wiederaufnahme verwendet worden war, hatte sie - im Laufe der zehn Jahre - werden ein Problem, und ein passenderes Design hatte sie ersetzt. Grundsätzlich hatte jeder Gebrauch der Wiederaufnahme einen Misserfolg vertreten, getrennte Niveaus der Abstraktion zusammenhanglos zu halten."

Zeitgenössische Anwendungen stehen vielen Designherausforderungen gegenüber, wenn sie Ausnahme-Berühren-Strategien denken. Besonders in modernen Unternehmensniveau-Anwendungen müssen Ausnahmen häufig Prozess-Grenzen und Maschinengrenzen durchqueren. Ein Teil, eine feste Ausnahme-Berühren-Strategie zu entwerfen, erkennt an, als ein Prozess zum Punkt gescheitert hat, wo es durch den Softwareteil des Prozesses nicht wirtschaftlich behandelt werden kann.

Hardware-Ausnahme-Berühren/Fallen: IEEE 754 Schwimmpunkt

Das Hardware-Ausnahme-Berühren unterscheidet sich etwas von der durch Softwarewerkzeuge zur Verfügung gestellten Unterstützung, aber ähnliche Konzepte sind überwiegend. Bemerken Sie, dass im Zusammenhang von IEEE754, der Punkt-Hardware schwimmen lässt, der Begriff "Ausnahme" in einem verschiedenen Sinn zu seinem typischen Gebrauch auf Programmiersprachen gebraucht wird, um sich im Allgemeinen auf außergewöhnliche Bedingungen zu beziehen: IEEE 754 definiert eine Ausnahme als "ein Ereignis, das vorkommt, wenn eine Operation auf einem besonderen operands kein für jede angemessene Anwendung passendes Ergebnis hat. Diese Operation könnte einer oder mehr Ausnahmen durch das Hervorrufen des Verzugs oder, wenn ausführlich gebeten, ein sprachdefiniertes abwechselndes Berühren Zeichen geben."

Standardmäßig ein IEEE ist 754 Ausnahme resumable und wird durch das Ersetzen eines definierten Werts, z.B Unendlichkeit für ein Teilen durch die Nullausnahme behandelt, und erlaubt dann Gebrauch des Fehlers überprüfende Versorgungsstatus-Fahnen für die spätere Überprüfung dessen, ob die Ausnahme vorgekommen ist (sieh C99 Programmiersprache für ein typisches Beispiel des Berührens von IEEE 754 Ausnahmen).

Der IEEE gebraucht 754 Standard den Begriff "Abfangen", um sich auf das Benennen einer benutzergelieferten Ausnahme behandelnden Routine auf außergewöhnlichen Bedingungen zu beziehen, und ist eine optionale Zusatzeinrichtung des Standards. Der Standard empfiehlt mehrere Gebrauch-Drehbücher dafür einschließlich des Nichtstandartvorersatzes eines von der Wiederaufnahme gefolgten Werts (sieh für einen Beispiel-Gebrauch dieser Annäherung). Andere Beispiele schließen ein.

Aus dem in einer Prozession gehenden Gesichtspunkt sind Hardware-Unterbrechungen mit der Zusammenfassung fähigen Ausnahmen ähnlich, obwohl sie zum Programm-Fluss des Benutzers normalerweise ohne Beziehung sind.

Ausnahme-Sicherheit

Wie man

sagt, ist ein Stück des Codes vor der Ausnahme sicher, wenn Laufzeitmisserfolge innerhalb des Codes kranke Effekten, wie Speicherleckstellen, wirre versorgte Daten oder ungültige Produktion nicht erzeugen werden. Vor der Ausnahme sicherer Code muss auf dem Code gelegten invariants befriedigen, selbst wenn Ausnahmen vorkommen. Es gibt mehrere Niveaus der Ausnahme-Sicherheit:

  1. Misserfolg-Durchsichtigkeit, auch bekannt als keine Werfen-Garantie: Wie man versichert, folgen Operationen nach und befriedigen alle Voraussetzungen sogar in die Anwesenheit außergewöhnlicher Situationen. Wenn eine Ausnahme vorkommt, wird sie die Ausnahme weiter nicht hochwerfen. (Bestes Niveau der Ausnahme-Sicherheit.)
  2. Begehen Sie oder rollback Semantik, auch bekannt als starke Ausnahme-Sicherheit oder Garantie ohne Änderungen: Operationen können scheitern, aber haben gescheitert, wie man versichert, haben Operationen keine Nebenwirkungen, so behalten alle Daten ursprüngliche Werte.
  3. Grundlegende Ausnahme-Sicherheit: Die Teilweise Ausführung von erfolglosen Operationen kann Nebenwirkungen verursachen, aber invariants auf dem Staat werden bewahrt. Irgendwelche versorgten Daten werden gültige Werte enthalten, selbst wenn Daten verschiedene Werte jetzt aus der Zeit vor der Ausnahme haben.
  4. Minimale Ausnahme-Sicherheit auch bekannt als Garantie ohne Leckstelle: Die Teilweise Ausführung von erfolglosen Operationen kann ungültige Daten versorgen, aber wird keinen Unfall verursachen, und keine Mittel werden durchgelassen.
  5. Keine Ausnahme-Sicherheit: Keine Garantien werden (Schlechtestes Niveau der Ausnahme-Sicherheit) gemacht.

Denken Sie zum Beispiel einen klugen Vektor-Typ, wie C ++ 's oder Java. Wenn ein Artikel zu einem Vektoren hinzugefügt wird, muss der Vektor wirklich zur inneren Liste von Gegenständen beitragen und auch ein Feld der Zählung aktualisieren, das sagt, in wie viel Gegenstände sind. Es muss eventuell auch neues Gedächtnis zuteilen, wenn die vorhandene Kapazität nicht groß genug ist. Diese Speicherzuteilung kann fehlen und eine Ausnahme werfen. Wegen dessen würde ein Vektor, der Misserfolg-Durchsichtigkeit zur Verfügung stellt, sehr schwierig oder unmöglich sein zu schreiben. Jedoch kann der Vektor im Stande sein, die starke Ausnahme-Garantie ziemlich leicht anzubieten; in diesem Fall wird entweder die Einfügung darin erfolgreich sein, oder wird unverändert bleiben. Wenn der Vektor nur die grundlegende Ausnahme-Sicherheitsgarantie zur Verfügung stellt, wenn die Einfügung scheitert, können, oder kann nicht enthalten, aber mindestens wird es in einem konsequenten Staat sein. Jedoch, wenn der Vektor nur die minimale Garantie macht, ist es möglich, dass der Vektor ungültig sein kann. Zum Beispiel vielleicht wurde das Größe-Feld dessen erhöht, aber wurde nicht wirklich eingefügt, den Staat inkonsequent machend. Natürlich, ohne Garantie, kann das Programm abstürzen; vielleicht musste sich der Vektor ausbreiten, aber konnte das Gedächtnis nicht zuteilen und pflügt blind vorn, als ob die Zuteilung, rührendes Gedächtnis an einer ungültigen Adresse erfolgreich gewesen ist.

Gewöhnlich mindestens grundlegende Ausnahme-Sicherheit ist erforderlich. Misserfolg-Durchsichtigkeit ist schwierig durchzuführen, und ist gewöhnlich in Bibliotheken nicht möglich, wo ganze Kenntnisse der Anwendung nicht verfügbar sind.

Überprüfung des Ausnahme-Berührens

Der Punkt von Ausnahme-Berühren-Routinen soll sicherstellen, dass der Code Fehlerbedingungen behandeln kann. Um dieses Ausnahme-Berühren einzusetzen, sind Routinen genug robust, es ist notwendig, dem Code ein breites Spektrum von ungültigen oder unerwarteten Eingängen, solchen zu bieten, die über die Softwareschuld-Einspritzung und Veränderungsprüfung geschaffen werden können (der auch manchmal Fusseln-Prüfung genannt wird). Einer der schwierigsten Typen der Software, für die man Ausnahme-Berühren-Routinen schreibt, ist Protokoll-Software, da eine robuste Protokoll-Durchführung bereit sein muss, Eingang zu erhalten, der die relevante Spezifizierung (En) nicht erfüllt.

Um sicherzustellen, dass bedeutungsvolle Regressionsanalyse während eines Softwareentwicklungslebenszyklus-Prozesses geführt werden kann, sollte jede Ausnahme-Berühren-Überprüfung hoch automatisiert werden, und die Testfälle müssen in einem wissenschaftlichen, repeatable Mode erzeugt werden. Mehrere gewerblich verfügbare Systeme bestehen, die solche Prüfung durchführen.

In Laufzeitmotorumgebungen wie Java oder.NET, dort bestehen Sie Werkzeuge, die dem Laufzeitmotor und jedes Mal anhaften, dass eine Ausnahme von Interesse vorkommt, registrieren sie Beseitigen-Information, die im Gedächtnis zurzeit bestanden hat, wurde die Ausnahme geworfen (nennen Sie Stapel und Haufen-Werte). Diese Werkzeuge werden das automatisierte Ausnahme-Berühren oder die Fehlerauffangen-Werkzeuge genannt und geben 'Wurzelursache'-Auskunft für Ausnahmen.

Ausnahme-Unterstützung auf Programmiersprachen

Viele Computersprachen, wie Actionscript, Ada, BlitzMax, C ++, C#, D, ECMAScript, Eiffel, Java, ML, Object Pascal (z.B. Delphi, Freier Pascal, und ähnlich), Ziel-C, OCaml, PHP (bezüglich der Version 5), PL/1, Einleitung, Pythonschlange, REALbasic, Rubinrote, Visuelle Einleitung und die meisten.NET Sprachen haben eingebaute Unterstützung für Ausnahmen und das Ausnahme-Berühren. Das Ausnahme-Berühren ist allgemein nicht resumable auf jenen Sprachen und dem Ereignis einer Ausnahme (genauer, eine Ausnahme, die durch die Sprache behandelt ist) Suchen zurück durch den Stapel von Funktionsanrufen, bis ein Ausnahme-Dressierer mit einigen Sprachen gefunden wird, die nach dem Abwickeln des Stapels verlangen, als die Suche fortschreitet. D. h. wenn Funktion einen Dressierer für die Ausnahme, Anruf-Funktion enthält, die der Reihe nach Funktion nennt, und eine Ausnahme kommt darin vor, fungiert dann und kann begrenzt werden, und darin wird behandeln. Eine Ausnahme behandelnde Sprache, für die das nicht wahr ist, ist Allgemeines Lispeln mit seinem Bedingungssystem. Allgemeines Lispeln nennt den Ausnahme-Dressierer und wickelt den Stapel nicht ab. Das erlaubt, die Berechnung an genau demselben Platz fortzusetzen, wo der Fehler vorgekommen ist (zum Beispiel, wenn eine vorher fehlende Datei jetzt verfügbar ist). Die stackless Durchführung von Mythryl unterstützt unveränderlich-malige Ausnahme, die ohne das Stapel-Abwickeln behandelt.

Wenn es

geringer syntaktischer Unterschiede ausschließt, gibt es nur einige Ausnahme-Berühren-Stile im Gebrauch. Im populärsten Stil wird eine Ausnahme durch eine spezielle Behauptung (oder) mit einem Ausnahme-Gegenstand (z.B mit Java oder Object Pascal) oder ein Wert eines speziellen ausziehbaren aufgezählten Typs (z.B mit Ada) begonnen. Das Spielraum für Ausnahme-Dressierer fängt mit einer Anschreiber-Klausel (oder der Block-Starter der Sprache solcher als) an und endet im Anfang der ersten Dressierer-Klausel . Mehrere Dressierer-Klauseln können folgen, und jeder kann angeben, welche Ausnahme-Typen es behandelt, und was es Gebrauch für den Ausnahme-Gegenstand nennt.

Einige Sprachen erlauben auch eine Klausel , der verwendet wird, im Falle dass keine Ausnahme vorgekommen ist, bevor das Ende des Spielraums des Dressierers erreicht wurde. Üblicher ist eine zusammenhängende Klausel (oder), der durchgeführt wird, ob eine Ausnahme vorgekommen ist oder nicht, um normalerweise innerhalb des Körpers des Ausnahme behandelnden Blocks erworbene Mittel zu veröffentlichen. Namentlich, C ++ braucht nicht und stellt diese Konstruktion nicht zur Verfügung, und der Quellenerwerb Ist Initialisierungstechnik sollte verwendet werden, um solche Mittel stattdessen zu befreien.

In seiner ganzen, Ausnahme könnte Berühren-Code wie das aussehen (im Java ähnlichen Pseudocode; bemerken Sie, dass ein genannter Ausnahme-Typ irgendwo würde erklärt werden müssen):

versuchen Sie {\

Linie = console.readLine ;

wenn (line.length == 0) {\

werfen Sie neuer EmptyLineException ("Die von der Konsole gelesene Linie war leer!");

}\

console.printLine ("Hallo %s!" %-Linie);

console.printLine ("Das Programm ist erfolgreich" gelaufen);

} Fang (EmptyLineException e) {\

console.printLine ("Hallo!");

} Fang (Ausnahme e) {\

console.printLine ("Fehler:" + e.message );

} schließlich {\

console.printLine ("Das Programm endet jetzt");

}\

</Quelle>

Als eine geringe Schwankung verwenden einige Sprachen eine einzelne Dressierer-Klausel, die sich mit der Klasse der Ausnahme innerlich befasst.

C unterstützt verschiedene Mittel der Fehlerüberprüfung, aber wird allgemein nicht betrachtet, "das Ausnahme-Berühren zu unterstützen." Perl hat fakultative Unterstützung für das strukturierte Ausnahme-Berühren.

Der C ++ schließt abgeleiteter Eingebetteter C ++ Ausnahme-Berühren-Unterstützung aus, weil es die Größe des Gegenstand-Codes wesentlich vergrößern kann.

Durch die Unterstützung der Kontrastpythonschlange für die Ausnahme ist das Berühren durchdringend und konsequent. Es ist schwierig, ein robustes Pythonschlange-Programm zu schreiben, ohne seinen und Schlüsselwörter zu verwenden.

Ausnahme-Berühren-Durchführung

Die Durchführung der Ausnahme, die auf Programmiersprachen normalerweise behandelt, ist mit einem schönen Betrag der Unterstützung sowohl von einem Codegenerator als auch vom Laufzeitsystem verbunden, das einen Bearbeiter begleitet. (Es war die Hinzufügung der Ausnahme, die zu C ++ behandelt, der die nützliche Lebenszeit des ursprünglichen C ++ Bearbeiter, Cfront beendet hat.) Zwei Schemas sind am üblichsten. Die erste, dynamische Registrierung, erzeugt Code, der ständig Strukturen über den Programm-Staat in Bezug auf das Ausnahme-Berühren aktualisiert. Gewöhnlich fügt das ein neues Element zum Stapel-Rahmenlay-Out hinzu, das das weiß, welche Dressierer für die Funktion oder mit diesem Rahmen vereinigte Methode verfügbar sind; wenn eine Ausnahme geworfen wird, leitet ein Zeigestock im Lay-Out die Durchlaufzeit zum passenden Dressierer-Code. Diese Annäherung ist in Bezug auf den Raum kompakt, aber fügt Ausführung oben auf dem Rahmenzugang und Ausgang hinzu. Es wurde in vielen Durchführungen von Ada zum Beispiel allgemein verwendet, wo komplizierte Generation und Laufzeitunterstützung bereits für viele andere Spracheigenschaften erforderlich waren. Dynamische Registrierung, ziemlich aufrichtig seiend, um zu definieren, ist dem Beweis der Genauigkeit zugänglich.

Das zweite Schema und dasjenige, das in vielen Produktionsqualität C ++ Bearbeiter durchgeführt ist, sind eine tabellengesteuerte Annäherung. Das schafft statische Tische daran kompilieren und Bindezeit, die Reihen des Programm-Schalters zum Programm-Staat in Bezug auf das Ausnahme-Berühren verbinden. Dann, wenn eine Ausnahme geworfen wird, schlägt das Laufzeitsystem die aktuelle Instruktionsposition in den Tischen nach und bestimmt das, welche Dressierer im Spiel und was Bedürfnisse sind, getan zu werden. Diese Annäherung minimiert Manager oben für den Fall, wo eine Ausnahme nicht geworfen wird, obgleich auf Kosten von einem Raum, obwohl gesagter Raum in den read-only-, Datenabteilungen des speziellen Zwecks zugeteilt werden kann, die nicht geladen oder bis und umgesiedelt werden

wenn eine Ausnahme nicht geworfen wird. Diese zweite Annäherung ist auch höher, in Bezug auf Faden-Sicherheit zu erreichen.

Andere definitorische Schemas und Durchführungsschemas sind ebenso vorgeschlagen worden. Für Sprachen, die metaprogramming unterstützen, sind Annäherungen, die nicht oben überhaupt verbunden sind, vorgebracht worden.

Das Ausnahme-Berühren auf dem Design durch den Vertrag gestützt

Eine verschiedene Ansicht von Ausnahmen basiert auf den Grundsätzen des Designs durch den Vertrag und wird insbesondere durch die Sprache von Eiffel unterstützt. Die Idee ist, eine strengere Grundlage für die Ausnahme zu schaffen, die durch das Definieren genau behandelt, was "normales" und "anomales" Verhalten ist. Spezifisch basiert die Annäherung auf zwei Konzepten:

  • Misserfolg: Die Unfähigkeit einer Operation, seinen Vertrag zu erfüllen. Zum Beispiel kann eine Hinzufügung eine arithmetische Überschwemmung erzeugen (sie erfüllt seinen Vertrag nicht, eine gute Annäherung an die mathematische Summe zu schätzen); oder eine Routine kann scheitern, seine Postbedingung zu entsprechen.
  • Ausnahme: Ein anomales Ereignis, das während der Ausführung einer Routine vorkommt (dass Routine der "Empfänger" der Ausnahme ist), während seiner Ausführung. Solch ein anomales Ereignis ergibt sich aus dem Misserfolg einer durch die Routine genannten Operation.

Der "Sichere Ausnahme-Berühren-Grundsatz", wie eingeführt, durch Bertrand Meyer im Objektorientierten Softwareaufbau meint dann, dass es nur zwei bedeutungsvolle Weisen gibt, wie eine Routine reagieren kann, wenn eine Ausnahme vorkommt:

  • Misserfolg, oder "organisierte Panik": Die Routine scheitert, eine Ausnahme in seinem Anrufer auslösend (so dass das anomale Ereignis nicht ignoriert wird!), nach dem Befestigen des Staates des Gegenstands durch das Wiederherstellen des invariant (der "organisierte" Teil).
  • Wiederholung: Versuchen Sie den Algorithmus wieder, gewöhnlich nach dem Ändern einiger Werte, so dass der folgende Versuch eine bessere Chance haben wird erfolgreich zu sein.

Hier ist ein in der Syntax von Eiffel ausgedrücktes Beispiel. Es nimmt an, dass eine Routine normalerweise die bessere Weise ist, eine Nachricht zu senden, aber es kann scheitern, eine Ausnahme auslösend; wenn so, der Algorithmus verwendet als nächstes, der weniger häufig scheitern wird. Wenn scheitert, die Routine senden als Ganzes sollte scheitern, den Anrufer veranlassend, eine Ausnahme zu bekommen.

senden Sie (M: NACHRICHT) ist

- Senden Sie M durch die schnelle Verbindung, wenn möglich, sonst durch die langsame Verbindung.

lokaler

tried_fast, tried_slow: BOOLEAN

tun Sie

wenn tried_fast dann

tried_slow: = Wahrer

send_slow (M)

sonst

tried_fast: = Wahrer

send_fast (M)

Ende

Rettung

wenn nicht tried_slow dann

verhandeln Sie neu

Ende

Ende

</Quelle>

Die boolean lokalen Variablen werden zum Falschen am Anfang initialisiert. Wenn scheitert, wird der Körper (Klausel) wieder durchgeführt, Ausführung dessen verursachend. Wenn diese Ausführung dessen scheitert, wird die Klausel zum Ende ohne (keine Klausel im Finale) durchführen, die alltägliche Ausführung als Ganzes veranlassend, zu scheitern.

Diese Annäherung hat das Verdienst, klar zu definieren, wie "normale" und "anomale" Fälle sind: Ein anomaler Fall, eine Ausnahme verursachend, ist derjenige, in dem die Routine unfähig ist, seinen Vertrag zu erfüllen.

Es definiert einen klaren Vertrieb von Rollen: Die Klausel (normaler Körper) trägt für das Erzielen oder das Versuchen die Verantwortung, der Vertrag der Routine zu erreichen; die Klausel trägt für das Wiederherstellen des Zusammenhangs und Wiederstarten des Prozesses die Verantwortung, wenn das eine Chance hat erfolgreich zu sein, aber nicht, eine wirkliche Berechnung durchzuführen.

Karierte Ausnahmen

Die Entwerfer Javas haben überprüfte Ausnahmen ausgedacht, die ein spezieller Satz von Ausnahmen sind. Die karierten Ausnahmen, die eine Methode erheben kann, sind ein Teil der Unterschrift der Methode. Zum Beispiel, wenn eine Methode werfen könnte, muss sie diese Tatsache ausführlich in seiner Methode-Unterschrift erklären. Misserfolg, so zu tun, erhebt einen Übersetzungszeit-Fehler.

Das ist mit Ausnahme-Kontrolleuren verbunden, die mindestens für OCaml bestehen. Das Außenwerkzeug für OCaml ist beide unsichtbar (d. h. es verlangt keine syntaktischen Anmerkungen), und fakultativ (d. h. es ist möglich, ein Programm zu kompilieren und zu führen, ohne die Ausnahmen überprüft zu haben, obwohl das für den Produktionscode nicht angedeutet wird).

Die CLU Programmiersprache hatte eine Eigenschaft mit der Schnittstelle, die daran näher ist, was Java später eingeführt hat. Eine Funktion konnte nur in seinem Typ verzeichnete Ausnahmen erheben, aber irgendwelche leckenden Ausnahmen von genannten Funktionen würden in die alleinige Laufzeitausnahme automatisch verwandelt, anstatt auf Übersetzungszeit-Fehler hinauszulaufen. Später hatte Modula-3 eine ähnliche Eigenschaft. Diese Eigenschaften schließen die Übersetzungszeit nicht ein überprüfend, der im Konzept karierter Ausnahmen zentral ist, und nicht (bezüglich 2006) gewesen vereinigt in Hauptprogrammiersprachen außer Java hat.

Der C ++ Programmiersprache führt einen fakultativen Mechanismus für karierte Ausnahmen, genannt Ausnahme-Spezifizierungen ein. Standardmäßig kann jede Funktion jede Ausnahme werfen, aber das kann durch eine Klausel beschränkt werden, die zur Funktionsunterschrift hinzugefügt ist, die angibt, welche Ausnahmen die Funktion werfen kann. Ausnahme-Spezifizierungen werden während der Übersetzung nicht beachtet. Übertretungen laufen auf die globale Funktion hinaus, die wird nennt. Eine leere Ausnahme-Spezifizierung kann gegeben werden, der anzeigt, dass die Funktion keine Ausnahme werfen wird. Das wurde der Verzug nicht gemacht, als das Ausnahme-Berühren zur Sprache hinzugefügt wurde, weil es zu viel Modifizierung des vorhandenen Codes verlangen würde, Wechselwirkung mit dem Code behindern würde, der auf einer anderen Sprache geschrieben ist, und Programmierer ins Schreiben zu vieler Dressierer am lokalen Niveau verlocken würde. Der ausführliche Gebrauch von leeren Ausnahme-Spezifizierungen kann jedoch C ++ Bearbeiter erlauben, bedeutenden Code und Stapel-Lay-Out-Optimierungen durchzuführen, die normalerweise unterdrückt werden müssen, wenn das Ausnahme-Berühren in einer Funktion stattfinden kann. Einige Analytiker sehen den richtigen Gebrauch von Ausnahme-Spezifizierungen in C ++ als schwierig an zu erreichen. Im C ++ Sprachstandard (C ++ 11) wird der Gebrauch von Ausnahme-Spezifizierungen, wie angegeben, in der vorhergehenden Version des Standards (C ++ 03) missbilligt.

Im Gegensatz zu Java machen Sprachen wie C# das nicht geltend Ausnahmen müssen gefangen werden. Das nicht Unterscheiden zwischen zukünftig genannten (überprüften) Ausnahmen und (ungehemmte) Ausnahmen nicht genannt zu werden, macht das schriftliche Programm günstiger, aber weniger robust, weil eine ungefangene Ausnahme auf einen Abbruch mit einer Stapel-Spur hinausläuft.

Ansichten auf dem Gebrauch

Karierte Ausnahmen können während der Übersetzung das Vorkommen von unbehandelten Ausnahmen reduzieren, die an der Durchlaufzeit in einer gegebenen Anwendung auftauchen; die ungehemmten Ausnahmen (s und s in Java) bleiben unbehandelt.

Jedoch können karierte Ausnahmen entweder umfassende Behauptungen, enthüllende Durchführungsdetails verlangen und encapsulation abnehmend oder dazu ermuntern, schlecht überlegte Blöcke zu codieren, die legitime Ausnahmen von ihren passenden Dressierern verbergen können. Denken Sie ein Wachsen codebase mit der Zeit. Wie man erklären kann, wirft eine Schnittstelle Ausnahmen X & Y. In einer späteren Version des Codes, wenn man Ausnahme Z werfen will, würde sie den neuen Code unvereinbar mit dem früheren Gebrauch machen. Außerdem, mit dem Adapter-Muster, wo ein Körper des Codes eine Schnittstelle erklärt, die dann durch einen verschiedenen Körper des Codes durchgeführt wird, so dass Code eingesteckt und durch das erste genannt werden kann, kann der Adapter-Code einen reichen Satz von Ausnahmen haben, um Probleme zu beschreiben, aber wird gezwungen, die in der Schnittstelle erklärten Ausnahme-Typen zu verwenden.

Es ist wahr, dass Behauptungen wie in Java Durchführungsdetails offenbaren. Das Bilden davon günstiger, das Erlauben eines Ausnahme-Anrufs ohne diese Behauptung reduzieren Robustheit des Codes.

Es ist möglich, die Anzahl von offen erklärten Ausnahmen entweder durch das Erklären einer Superklasse aller potenziell geworfenen Ausnahmen oder durch das Definieren und das Erklären von Ausnahme-Typen zu vermindern, die für das Niveau der Abstraktion der genannten Methode passend sind, und Ausnahmen der niedrigeren Ebene zu diesen Typen, vorzugsweise das gewickelte Verwenden des Ausnahme-Ankettens kartografisch darstellend, um die Wurzelursache zu bewahren. Außerdem ist es sehr möglich, dass im Beispiel oben der sich ändernden Schnittstelle, dass der Benennen-Code ebenso, seitdem in einem würde modifiziert werden müssen, die Ausnahmen fühlen, die eine Methode werfen kann, sind ein Teil der impliziten Schnittstelle der Methode irgendwie.

Das Verwenden einer minimalen Behauptung oder ist genügend, für die Gepäckaufgabe Javas zu befriedigen. Während das einen Nutzen haben kann, überlistet er im Wesentlichen den karierten Ausnahme-Mechanismus, eine durch das berufliche Java entmutigte Codierwahl zu sein, codiert Entwerfer.

Ungehemmte Ausnahme-Typen sollten außer mit der Rücksicht an den äußersten Niveaus des Spielraums nicht behandelt werden. Diese vertreten häufig Drehbücher, die Wiederherstellung nicht berücksichtigen: s widerspiegeln oft Programmierdefekte, und s vertreten allgemein unwiedergutzumachende JVM Misserfolge. Die Ansicht besteht darin, dass sogar auf einer Sprache, die karierte Ausnahmen unterstützt, es Fälle gibt, wo der Gebrauch von karierten Ausnahmen nicht passend ist.

Ausnahme synchronicity

Etwas verbunden mit dem Konzept karierter Ausnahmen ist Ausnahme synchronicity. Gleichzeitige Ausnahmen geschehen an einer spezifischen Programm-Behauptung, wohingegen asynchrone Ausnahmen praktisch überall erheben können. Hieraus folgt dass das asynchrone Ausnahme-Berühren durch den Bearbeiter nicht erforderlich sein kann. Sie sind auch zum Programm damit schwierig. Beispiele natürlich asynchroner Ereignisse schließen drückenden Ctrl-C ein, um ein Programm und Empfang eines Signals wie "Halt" zu unterbrechen oder von einem anderen Faden der Ausführung "aufzuheben".

Programmiersprachen befassen sich normalerweise damit durch das Begrenzen asynchronicity, zum Beispiel hat Java den Gebrauch seiner Ausnahme von ThreadDeath missbilligt, die verwendet wurde, um einem Faden zu erlauben, einen anderen aufzuhören. Statt dessen kann es halbasynchrone Ausnahmen geben, die nur in passenden Positionen des Programms oder gleichzeitig erheben.

Bedingungssysteme

Allgemeines Lispeln, Dylan und Plausch haben ein Bedingungssystem (sieh Allgemeines Lispeln-Bedingungssystem), der die oben erwähnten Ausnahme-Berühren-Systeme umfasst. Auf jenen Sprachen oder Umgebungen bezieht das Advent einer Bedingung (eine "Verallgemeinerung eines Fehlers" gemäß Kent Pitman) einen Funktionsanruf ein, und nur spät im Ausnahme-Dressierer kann die Entscheidung, den Stapel abzuwickeln, getroffen werden.

Bedingungen sind eine Generalisation von Ausnahmen. Wenn eine Bedingung entsteht, wird nach einem passenden Bedingungsdressierer gesucht und in der Stapel-Ordnung ausgewählt, um die Bedingung zu behandeln. Bedingungen, die Fehler nicht vertreten, können unbehandelt völlig sicher gehen; ihr einziger Zweck kann sein, Hinweise oder Warnungen zum Benutzer fortzupflanzen.

Ausnahmen von Continuable

Das ist mit dem so genannten Wiederaufnahme-Modell des Ausnahme-Berührens verbunden, in dem, wie man sagt, einige Ausnahmen continuable sind: Es wird erlaubt, zum Ausdruck zurückzukehren, der einer Ausnahme Zeichen gegeben hat, Verbesserungshandlung im Dressierer genommen. Das Bedingungssystem wird so verallgemeinert: Innerhalb des Dressierers einer nichternsten Bedingung (a.k.a. continuable Ausnahme) ist es möglich, zu vorherbestimmten Wiederanfang-Punkten zu springen (a.k.a. Wiederanfänge), die zwischen dem Signalausdruck und dem Bedingungsdressierer liegen. Wiederanfänge sind über eine lexikalische Umgebung geschlossene Funktionen, dem Programmierer erlaubend, diese Umgebung vor dem Herausnehmen über den Bedingungsdressierer völlig oder Abwickeln des Stapels sogar teilweise zu reparieren.

Wiederanfänge trennen Mechanismus von der Politik

Bedingung, die außerdem behandelt, stellt eine Trennung des Mechanismus von der Politik zur Verfügung. Wiederanfänge stellen verschiedene mögliche Mechanismen zur Verfügung, um sich von Fehler zu erholen, aber wählen nicht aus, welcher Mechanismus in einer gegebenen Situation passend ist. Das ist die Provinz des Bedingungsdressierers, der (da sie im Code des höheren Niveaus gelegen wird) Zugang zu einer breiteren Ansicht hat.

Ein Beispiel: Nehmen Sie An, dass es eine Bibliotheksfunktion gibt, deren Zweck ist, einen einzelnen syslog Dateizugang grammatisch zu analysieren. Was sollte diese Funktion tun, wenn der Zugang missgebildet ist? Es gibt keine richtige Antwort, weil dieselbe Bibliothek in Programmen zu vielen verschiedenen Zwecken aufmarschiert werden konnte. In einem interaktiven Protokolldatei-Browser könnte das richtige Ding zu tun sein, den grammatisch unnalysierten Zugang zurückzugeben, so kann der Benutzer es sehen — aber in einem automatisierten Klotz zusammenfassenden Programm könnte das richtige Ding zu tun sein, ungültige Werte für die unlesbaren Felder zu liefern, aber der Abbruch mit einem Fehler, wenn zu viele Einträge missgebildet gewesen sind.

Das heißt, kann auf die Frage nur in Bezug auf die breiteren Absichten des Programms geantwortet werden, die der Mehrzweckbibliotheksfunktion nicht bekannt sind. Dennoch ist das Herausnehmen mit einer Fehlermeldung nur selten die richtige Antwort. So, anstatt einfach mit einem Fehler abzugehen, kann die Funktion Wiederanfänge gründen, die verschiedene Weisen anbieten — zum Beispiel weiterzugehen, den Klotz-Zugang auszulassen, Verzug oder ungültige Werte für die unlesbaren Felder zu liefern, den Benutzer um die fehlenden Werte zu bitten, oder den Stapel und Abbruch abzuwickeln, der mit einer Fehlermeldung in einer Prozession geht. Die angebotenen Wiederanfänge setzen die Mechanismen ein, die verfügbar sind, um sich von Fehler zu erholen; die Auswahl am Wiederanfang durch den Bedingungsdressierer liefert die Politik.

Siehe auch

  • Abrahams versichert
  • Verlängerung
  • Ausnahme-Berühren-Syntax
  • setjmp/longjmp
  • Dreifache Schuld
  • Vectored Exception Handling (VEH)

Links


Teilen Sie sich und siegen Sie / Liste von Entomologen
Impressum & Datenschutz