it-swarm.com.de

(RuntimeException $ e) vs (JDatabaseExceptionExecuting $ e) für die Behandlung von SQL-Ausnahmen

In der aktuellen Version von Joomla (3.9.6) finde ich eine Mischung aus Möglichkeiten, wie SQL-Ausnahmen behandelt werden, und ich habe mich gefragt, ob mir jemand endgültige Situationen geben könnte, in denen eine im Gegensatz zur anderen verwendet werden sollte.

Wenn ich für die neuesten Versionen von Joomla entwickle, sollte ich für meine Abfrage immer JDatabaseExceptionExecuting verwenden, um Catch-Blöcke zu versuchen?

Ref:

  • (RuntimeException $ e) Administrator/Komponenten/com_redirect/models/link.php Zeile 40
  • (JDatabaseExceptionExecuting $ e) Plugins/system/actionlogs/actionlogs.php Zeile 192

Zusatzinformation

Für alle anderen, die mehr Informationen zu diesem Thema wünschen.

Github-Link: https://github.com/joomla/joomla-cms/pull/10337

Fügen Sie neue Datenbankausnahmen # 10337 hinzu und verwenden Sie sie

Die Datenbank-API löst eine RuntimeException für alle Fehlerbedingungen aus. Es ist zwar gut, dass Ausnahmen ausgelöst werden, da diese Klasse in der Exception-Klassenkette hoch ist (sie ist ein direkter Nachfahre von Exception und wird von beiden PHP Core- und Drittanbieter-Bibliotheken) stark unterklassifiziert generische Klasse und bietet nicht viel Kontext darüber, warum der Fehler ausgelöst wurde, ohne die Zeichenfolge zu analysieren.

Dieser PR erstellt mehrere kontextbezogene Ausnahmeklassen für die Datenbank-API und ändert sie, um diese Unterklassen anstelle der allgemeineren RuntimeException auszulösen. Da alle diese neuen Ausnahmeklassen die RuntimeException erweitern, gibt es keine B/C-Unterbrechung bei vorhandenen Try/Catch-Verwendungen.

Es gibt drei JDatabse-Ausnahmeklassen, die RuntimeException erweitern

JDatabaseExceptionUnsupported

  • Ausnahmeklasse, die ein nicht unterstütztes Datenbankobjekt definiert
  • bibliotheken/joomla/database/exception/unsupported.php

JDatabaseExceptionExecuting

  • Ausnahmeklasse, die einen Fehler beim Ausführen einer Anweisung definiert
  • bibliotheken/joomla/database/exception/executing.php

JDatabaseExceptionConnecting

  • Ausnahmeklasse, die einen Fehler beim Herstellen einer Verbindung zur Datenbankplattform definiert
  • bibliotheken/Joomla/Datenbank/Ausnahme/Connecting.php
4
CoalaWeb

Der Unterschied zwischen einer RuntimeException und einer JDatabaseExceptionExecuting ist eine Frage der Semantik und Erbe.

In PHP erweitert RuntimeException die Exception-Klasse (die Basisklasse, die vor PHP7 keine Throwable-Schnittstelle bereitstellte).

https://www.php.net/manual/en/class.exception.php

https://php.net/manual/en/class.runtimeexception.php

https://api.joomla.org/cms-3/classes/JDatabaseExceptionExecuting.html

Das Erweitern einer Klasse wird durchgeführt, um spezielle Handles/Details auf eine Weise bereitzustellen, die die ursprüngliche Klasse nicht bereitstellt.

JDatabaseExceptionExecuting ist einfach eine artikulierte/dedizierte Methode, um eine erwartete Art von Ausnahme abzufangen. Wenn Sie wissen, welche Art von Ausnahme in einem bestimmten Teil des Codes wahrscheinlich generiert wird, können Sie sehr bewusst überlegen, wie Sie damit umgehen möchten, und daher die Methoden innerhalb der am besten geeigneten Klasse verwenden. Folgendes macht es:

Ausnahmeklasse, die einen Fehler beim Ausführen einer Anweisung definiert

getQuery() ist die einzige Methode (jenseits des Konstruktors) innerhalb der Klasse JDatabaseExceptionExecuting, die die Klasse RuntimeException erweitert, die die Basisklasse Exception erweitert.

Diese Stackoverflow-Seite sollte hilfreich sein: https://stackoverflow.com/q/41608131/29434

Letztendlich ist mein Rat, JDatabaseExceptionExecuting zu verwenden, wenn versucht wird, eine Ausnahme abzufangen, die beim Ausführen einer Abfrageanweisung erzeugt wird. Andernfalls sollten Sie RuntimeException verwenden (oder eine andere geeignete Klasse, die auf die jeweilige Situation spezialisiert wurde).

4
mickmackusa