[JAVA] Ich möchte eine Struktur für die Ausnahmebehandlung entwerfen

Motivation

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".

1. Über Ausnahmen

1.1. Funktionen

Identifizieren Sie die Merkmale der Ausnahme.

1.2 Ausnahmegrenzen

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

2. Untersuchen Sie die Ursache durch Ausnahmebehandlung

Ü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);
}

2.1 Verwenden Sie zusätzliche Informationen, wenn Sie eine Ausnahme auslösen

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.

2.2 Struktur mit logischen Ausnahmen

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.

2.2.1 Vererbungsbaum für Ausnahmeklassen

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

2.2.2 Fehler oder Misserfolg

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.

2.2.3 Isolation (wer ist schlecht)

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.)

2.2.4 Umfrageergebnisse

Als Ergebnis wird eine Stapelverfolgung hinzugefügt und das Untersuchungsergebnis abgeschlossen. Ein Beispiel des obigen Beispiels wird beschrieben.

3. Was tun mit Ausnahmen?

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.

3.1 Grundregeln für das Abfangen aller Ausnahmen

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.

3.2. Dem Entwickler einen Fehler melden

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
}

4. Zusammenfassung

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

Ich möchte eine Struktur für die Ausnahmebehandlung entwerfen
Ich möchte eine Webanwendung entwickeln!
Ich möchte ein schönes build.gradle schreiben
Ich möchte einen Unit Test schreiben!
[Ruby] Ich möchte einen Methodensprung machen!
Ich möchte eine einfache Wiederholung einer Zeichenkette schreiben
Ich möchte eine Methode einer anderen Klasse aufrufen
Ich möchte eine bestimmte Datei mit WatchService überwachen
Ich möchte eine Funktion in der Rails Console definieren
Ich möchte in RSpec auf einen GoogleMap-Pin klicken
Ich möchte eine generische Anmerkung für einen Typ erstellen
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
Ich möchte Zeichen konvertieren ...
[Java] Ich möchte ein Byte-Array in eine Hexadezimalzahl konvertieren
Ich möchte einen relativen Pfad in einer Situation finden, in der Pfad verwendet wird
Ich möchte eine Produktinformationsbearbeitungsfunktion ~ part1 ~ implementieren
Ich möchte ein bestimmtes Modell von ActiveRecord ReadOnly erstellen
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich möchte dem select-Attribut einen Klassennamen geben
Ich möchte eine Parkettdatei auch in Ruby erstellen
Ich möchte FireBase verwenden, um eine Zeitleiste wie Twitter anzuzeigen
[Rails] Wie schreibe ich eine Ausnahmebehandlung?
Ausnahmebehandlung mit einer Fluidschnittstelle
Ich möchte rekursiv nach Dateien in einem bestimmten Verzeichnis suchen
Ich möchte mit link_to [Hinweis] eine Schaltfläche mit einem Zeilenumbruch erstellen.
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Ich möchte Swipeback auf einem Bildschirm verwenden, der XLPagerTabStrip verwendet
Ich möchte mit einem regulären Ausdruck zwischen Zeichenketten extrahieren
[Rails] Ich möchte Daten verschiedener Modelle in einem Formular senden
Ich möchte doppelte Fehlermeldungen beseitigen
Ich möchte eine ios.android App machen
Ich möchte im Dialogfeld mehrere Elemente mit einem benutzerdefinierten Layout auswählen
Ich möchte DBViewer mit Eclipse 2018-12 verwenden! !!
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
Ich möchte Apache Wicket 8 zusammenfassen, weil es eine gute Idee ist
Ich möchte PHP 7.2 unter Ubuntu 20.04 installieren.
Ich möchte mit Jakarta EE 8 mit Java 11 ein dunkles Web-SNS erstellen
Ausnahmebehandlung
Ich möchte ein chinesisches (koreanisches) PDF mit dünnen Berichten anzeigen
Ich möchte Java-Updates insgesamt stoppen
Ich möchte @Autowired in Servlet verwenden
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Ich möchte statische Felder auf @Autowired ausrichten
Ich möchte die Teamentwicklung aus der Ferne durchführen
"Lehrer, ich möchte im Frühjahr eine Anmeldefunktion implementieren" ① Hallo Welt
Ausnahmebehandlung Ausnahme