Ich habe verschiedene Artikel zur Ausnahmebehandlung gelesen, aber ich habe sie nicht verstanden, also habe ich meine Perspektive erweitert. Fassen Sie aus der Perspektive zusammen, "wie Ausnahmen im System verwendet werden, um die Qualität zu verbessern".
Identifizieren Sie die Merkmale der Ausnahme.
Das Wesen von Ausnahmen liegt in der Beziehung zwischen dem Aufrufer und dem Ausnahmegenerator. Es ist nur eine Funktion, um den Anrufer über eine Nachricht zu benachrichtigen. Es ist notwendig, alle Ursachen zu ermitteln, z. B. Remote-Programme und andere Kooperationsziele.
Wenn Sie es so verwenden, wie es ist
Überlegen Sie, wie Sie es implementieren, damit der Entwickler den Code nicht so oft wie möglich lesen muss. Der Gesichtspunkt der Ursachenuntersuchung ist wie folgt.
Organisieren Sie anhand der folgenden Beispielimplementierung. Einige Methoden sind der Kürze halber weggelassen.
//Banküberweisungsklasse
class BankTransfer implements BankProcess {
//Überweisungsinformationen
Account from; //Überweisungsquellkonto
Account to; //Überweisungskonto
long amount; //Überweisungsbetrag
//Übertragungsverarbeitung
@override
void process() throws BankException {
try {
from.withdrawal(amount); //Auszahlungsverarbeitung
to.deposit(amount); //Einzahlungsabwicklung
log("transfer completed."); //Protokollausgabe
} catch (TransferException e) {
//Geld konnte nicht überwiesen werden
log("transfer failed."); //Protokollausgabe
rollback();
log("rollback completed.");
throw e;
}
}
}
//Kontoverarbeitung
abstract class Account {
int no; //Kontonummer
//Einzahlungsabwicklung
void deposit(long amount) {
try {
//Annahme, dass eine Ausnahme auftritt
deposit(amount);
} catch (ConnectionTimeoutException e) { //2.2.3 Wagen (wer ist schlecht)
//Verbindung fehlgeschlagen und Kontoverwaltungssystem ist nicht verfügbar
var error = new TransferException(e); //2.2 Struktur mit logischen Ausnahmen
error.setNo(this.no); //2.1 Verwendung zusätzlicher Informationen
throw error;
}
}
//Auszahlungsverarbeitung
void withdrawal(long amount) {
try {
//Annahme, dass eine Ausnahme auftritt
withdrawal();
} catch (ConnectionTimeoutException e) { //2.2.3 Wagen (wer ist schlecht)
//Verbindung fehlgeschlagen und Kontoverwaltungssystem ist nicht verfügbar
var error = new TransferException(e); //2.2 Struktur mit logischen Ausnahmen
error.setNo(this.no); //2.1 Verwendung zusätzlicher Informationen
throw error;
}
}
//Abstrahiert, weil jedes Konto eine andere Bank hat
abstract void deposit(int no, long amount);
abstract void withdrawal(int no, long amount);
}
Wenn eine Ausnahme ausgelöst wird, können die Informationen in der Methode, die die catch-Anweisung implementiert, gesammelt werden. Legen Sie ausnahmsweise die zugehörigen Daten vom Beginn der Methode bis zum Auftreten des Fangs fest. Sammeln Sie relevante Daten bis zum letzten.
Die folgenden Gesichtspunkte wurden gelöst.
Unter folgenden Gesichtspunkten werden wir die notwendigen Informationen als Ergebnis der Ursachenuntersuchung bereitstellen.
Danach werden wir die leicht vorstellbare "Banküberweisungsverarbeitung" als Beispiel verwenden und sie mit logischen Ausnahmen implementieren. Konzentrieren Sie sich auf den Implementierungsteil der Ausnahmebehandlung.
Der Name der Ausnahmeklasse informiert Sie darüber, dass "Verarbeitung fehlgeschlagen" ist, der Klassenname jedoch als Betreff fungiert. Die folgenden Ausnahmeklassen zeigen den Vererbungsbaum.
RuntimeException Deaktivierte Ausnahme
└── BankException Bankfehler
└── NameResolveException Name Adressierungsprozess fehlgeschlagen (unten irrelevant)
└── TransferException Die Übertragungsverarbeitung ist fehlgeschlagen
Um es als Fehler zu beurteilen, kann es behoben werden, indem eine Regel zum Abfangen von Ausnahmen festgelegt wird. Um es anders herum auszudrücken, ist es wichtig, wie Sie die erwartete Ausnahme genau bestimmen können. Zu diesem Zweck ist es im Fall einer abstrakten Ausnahme (SQLException usw.) erforderlich, die zu verarbeitenden Ausnahmeinstanzen durch die zusätzlichen Informationen der Ausnahme einzugrenzen.
Bei der Ursachenuntersuchung werden die notwendigen Dinge isoliert, aber die Charaktere, die allgemein vermutet werden, sind wie folgt.
--Benutzer (möglicherweise ist die Operation schlecht) --Operator (Ist die Konfiguration / Operation nicht schlecht?)
Dieses Problem kann durch die abgefangene physische Ausnahme (die eine Ausnahme verursacht) identifiziert werden. Ein Beispiel ist unten gezeigt.
Sie können die obere Methode frei benachrichtigen. Es ist auch gut, es als zusätzliche Information in der logischen Ausnahme festzulegen. Sie können auch eine neue OperatorException-Klasse erstellen (eine Klasse, die einen Operationsfehler vorschlägt) und die Anzahl der abstrakten Ausnahmeklassen erhöhen. Sie können es auch in die Nachricht schreiben. (Da die Verbindung fehlgeschlagen ist, ist XX fehlgeschlagen.)
Als Ergebnis wird eine Stapelverfolgung hinzugefügt und das Untersuchungsergebnis abgeschlossen. Ein Beispiel des obigen Beispiels wird beschrieben.
Die auftretende Ausnahme muss irgendwo abgefangen und irgendwie verarbeitet werden. Das Motiv dieses Entwurfskonzepts ist, "Ausnahmen im System zu nutzen, um die Qualität zu verbessern", daher hielt ich die folgenden Regeln für notwendig.
Es gibt nur wenige Gründe, "Ausnahme" zu verwenden, um alle Ausnahmen abzufangen.
Die Fälle, die implementiert werden können, sind unten gezeigt.
Einige Dinge, wie z. B. Webanwendungsserver, behandeln Ausnahmen ordnungsgemäß. In diesem Fall müssen Sie nicht alles fangen. Das Verhalten muss überprüft werden, wenn WAS eine Ausnahme abfängt.
Wenn Sie alle in 3.1 gezeigten Ausnahmen abfangen, werden auch unerwartete physische Ausnahmen abgefangen. Daher ist es notwendig, den Fehlerbericht in einer zusammenhängenden Form an den Entwickler aufzuzeichnen. Die möglichen Methoden sind wie folgt.
Logische Ausnahmen (erwartete Ausnahmen) und physische Ausnahmen (unerwartete Ausnahmen) können leicht unterschieden werden. Hier wird die Verallgemeinerung und Spezialisierung von Ausnahmeklassen zum Leben erweckt. Das Folgende ist ein Codebeispiel.
try {
var job = new BankTransfer(from, to);
job.process();
} catch (BankException e) {
//Behandlung von erwarteten Ausnahmen
} catch (RuntimeException e) {
//Umgang mit unerwarteten Ausnahmen
}
Wenn Sie keine eigene Ausnahmeklasse erstellen, können Sie anhand des Namens der aufgetretenen Ausnahmeklasse nicht feststellen, ob es sich um einen Fehler oder einen Fehler handelt. Es ist auch nicht möglich, Informationen für die Reproduktion zu erhalten. Durch die Realisierung der folgenden Dinge ist es daher möglich, Informationen zu finden, die zur frühzeitigen Identifizierung der Ursache wirksam sind.
--Erstellen Sie Ihre eigene Ausnahmeklasse und gestalten Sie sie strukturiert
Recommended Posts