Das Suffix Ausnahme bei Ausnahmen in Java

19

Das Angeben eines Ausnahmesuffixes für Ausnahmeklassen fühlt sich für mich wie ein Codegeruch an (redundante Informationen - der Rest des Namens impliziert einen Fehlerzustand und erbt von Exception). Es scheint jedoch auch, dass jeder es tut und es scheint eine gute Übung zu sein.

Ich möchte verstehen, warum dies eine gute Praxis ist.

Ich habe bereits die Frage gesehen und gelesen, warum Ausnahmen normalerweise die Suffix-Ausnahme im Klassennamen haben

Die Frage ist für PHP und während die Antworten wahrscheinlich für Java gültig sind. Gibt es noch andere Argumente oder ist es wirklich so einfach, sie explizit zu differenzieren?

Nehmen wir die Beispiele aus der vorherigen Frage: Könnte es in Java wirklich Klassen mit dem Namen geben FileNoFound, der keine Ausnahme darstellt? Wenn es welche geben könnte, ist es dann angebracht, sie mit einem Suffix zu versehen Exception?

Betrachtet man eine kurze Hierarchie in der Finsternis Exception, so haben die allermeisten das Suffix der Ausnahme, aber es gibt ein paar Ausnahmen. javassistist ein Beispiel für eine Bibliothek, die bis auf wenige Ausnahmen ohne das Suffix zu haben scheint - zB BadByteCode, BadHttpRequestusw.

BouncyCastle ist eine andere lib mit ausnahmen wie CompileError

Ich habe auch ein bisschen herumgegoogelt mit kleinen Infos zum Thema.

drone.ah
quelle
2
"Sollten alle Ausnahmen ein ExceptionSuffix tragen , oder sollten wir Ausnahmen für Ausnahmeausnahmen machen?" ;)
tdammers
2
tatsächlich ist Fehler wie Exception (siehe OutOfMemoryError) , aber sie sind für die Dinge zu verstehen , die von schwer zu erholen (so dass Sie fast nie mit ihnen umgehen)
Ratsche Freak
1
Ich habe auch gehört, dass Klassen im Allgemeinen Substantive und Methoden Verben (Aktionen) sein sollten. FileNotFound ArrayIndexOutOfBoundsund OutOfMemorysind mehr Beobachtungen / Beschreibungen, werden dann aber auf das Nomen angewendet Exception.
MikeTheLiar

Antworten:

27

Landeis Antwort ist gut, aber es gibt auch die grammatikalische Antwort. Klassennamen sollten Substantive sein . Was ist ein "OutOfMemory"? Was ist ein "FileNotFound"? Wenn Sie sich "Exception" als Substantiv vorstellen, dann ist der Deskriptor das Adjektiv, das es spezifiziert. Es ist nicht irgendein Exception, es ist ein FileNotFoundException. Sie sollten nicht mehr fangen müssen, OutOfMemoryals Sie in den Laden gehen würden, um ein "Blau" zu kaufen.

Dies zeigt sich auch, wenn Sie Ihren Code als Satz zu lesen: „ Trytun ... und catch OutOfMemory Exceptions

Bobson
quelle
1
Zitieren des Artikels "Versuchen Sie, Substantive zu verwenden, da eine Klasse normalerweise etwas in der realen Welt darstellt". Aber fallen Ausnahmen in diesen Fall? Für mich sind sie eher ein Programmier-Artefakt, das eine Fehlermeldung darstellt. "Sie werden eine OutOfMemoryAusnahme bekommen" lautet besser als "Sie werden eine OutOfMemoryExceptionAusnahme bekommen", nicht wahr?
Greg0ire
1
@ greg0ire - Du solltest es versuchen als "Du wirst eine bekommen OutOfMemoryException." Das heißt, wir haben auch PIN - Nummern und Geldautomaten, so eine OOME Ausnahme nicht wäre , dass ungewöhnlich.
Bobson
Ich denke, der Punkt, den Sie hier ansprechen, ist wirklich der beste (der über Namenskonflikte gilt nicht mehr dank Namespaces, zumindest in PHP). Ich habe noch mehr zu sagen und werde demnächst eine Antwort veröffentlichen.
greg0ire
Getan! Was denkst du?
Greg0ire
@ Bobson Ich empfehle The Kingdom of Nouns zu lesen . Wir brauchen nicht alles, um ein Substantiv zu sein. Warum "Sie werden eine bekommen OutOfMemoryException", wenn es einfach sein kann "Sie sind nicht mehr im Gedächtnis"? Wir verwenden Sie keine ClassSuffixe ( DogClass, CatClass, XmlReaderClass, ...).
Matthieu Napoli
6

Ich denke, Ausnahmen (und Fehler und theoretisch andere Throwable) unterscheiden sich von Dingen wie Schnittstellen oder Aufzählungen (die normalerweise nicht als Suffix verwendet werden): Sie haben normalerweise einen sehr klaren und begrenzten Zweck, sie werden mit speziellen Sprachkonstrukten verwendet ( try, catch, throw, throws) und folgen besondere Regeln (zB geprüft vs ungeprüften Ausnahmen, keine Generika). In gewisser Weise handelt es sich nicht nur um Klassen, die zufällig als Ausnahmen verwendet werden, sondern um einen Ausnahmemechanismus, der mithilfe von Klassen implementiert wird.

Wenn Sie sich also mit einer Ausnahme befassen und diese nicht als solche erkennen, ist normalerweise etwas zutiefst falsch (was wiederum bei Dingen wie Aufzählungen oder Schnittstellen nicht der Fall ist). Ich denke, diese Unterschiede zu "normalen" Klassen sind groß genug, um einen visuellen Hinweis zu liefern.

Landei
quelle
1
Klingt für mich widersprüchlich. Wenn Ausnahmen so speziell und in besonderer Weise verwendet werden und so offensichtlich erkennbar sind, warum brauchen Sie dafür einen visuellen Hinweis?
Michael Borgwardt
@MichaelBorgwardt - Ich denke, er sagt, dass sie den visuellen Hinweis haben sollten, offensichtlich erkennbar zu sein, weil sie besonders sind und auf besondere Weise verwendet werden. Davon abgesehen weiß ich nicht, ob Sie überhaupt etwas werfen können , von dem Exceptionin Java nichts geerbt wurde - in C # ist das nicht möglich. Wenn Sie dies nicht können, kann ich mir kein Szenario vorstellen, in dem Sie "eine Ausnahme behandeln und [nicht] als solche erkennen" würden.
Bobson
Sie können auch Throwablein Java keine Non- s werfen . Sie können sich jedoch nicht nur mit try- catch-Einstellungen befassen, sondern auch mit Ausnahmen , wenn Sie eine Art Validierung für komplexe Objekte durchführen (wenn Sie alle damit zusammenhängenden Probleme kennen möchten , nicht nur die erste). In solchen Fällen sollten Sie sich bewusst sein, dass Sie z. B. die Dinge, die Sie in Ihrer Liste haben, erneut werfen können, so dass es schlecht wäre, sie zu nennen, dh ValidationIssuestatt ValidationException.
Landei
0

Es scheint jedoch auch, dass jeder es tut und es scheint eine gute Übung zu sein.

Ja, jeder tut es, also ist es eine Übung, aber ist es immer noch gut? Mehrere Personen stellen dies in Frage:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (Das Ausnahmesuffix § context: php)
  • Das verlinkte Video https://vimeo.com/album/2661665/video/74316116 (springe zu 53:00, Kontext: php) inspiriert den Artikel und weist darauf hin, dass Sie jedes Mal, wenn Sie eine Ausnahme verwenden, ein Schlüsselwort haben das zeigt schon, es ist eine Ausnahme in der Nähe
  • http://verraes.net/2013/10/verbs-in-class-names/ zeigt, wie die Aussage in der Antwort von @Bobson möglicherweise nicht absolut ist, und weist darauf hin, dass das Suffix manchmal gut ist, für die Anwendung oder Ausnahmen auf Infrastrukturebene, und manchmal sollten Sie versuchen, die von diesem langen Suffix verwendeten Zeichen zu speichern, um etwas Präziseres und Bedeutsameres auszudrücken. Dieser Punkt ist nur sinnvoll, wenn Sie eine Sprache verwenden, in der die Kultur Ausnahmen für Verstöße gegen Geschäftsregeln verwenden soll.
  • Der von Ihnen bereitgestellte SO-Link enthält Hinweise zu Namenskonflikten, aber jetzt haben wir Namespaces, nicht wahr?
greg0ire
quelle
Dies ist eine Java- Frage, keine PHP- Frage . Redewendungen unterscheiden sich zwischen den Sprachen. Das heißt, ich bin mit diesem Zitat aus Ihrem dritten Link absolut nicht einverstanden: "Ausnahmen können Ereignissen ähnlich sein, ... mit der Nuance, dass es sich um ein unerwünschtes Ereignis handelt, eine Warnung, dass eine Operation zum Beispiel mit den Geschäftsregeln von sind in Kraft. " Vielleicht unterscheidet sich PHP in dieser Hinsicht, aber meiner Meinung nach sollten Ausnahmen außergewöhnlich sein. Wenn eine Geschäftsregel auf eine erwartete Weise verletzt wird, sollte Ihre normale Logik damit umgehen - dies ist keine Ausnahme vom normalen Verhalten.
Bobson
Sie können direkt sein , dass es auf einer Sprache pro Sprache Basis variiert: dieses Thema über Python sehen: gossamer-threads.com/lists/python/python/796627 . PHP und Python sind eindeutig nicht leistungsorientiert, deshalb gibt es vielleicht diesen Unterschied zu Java (was ist leistungsorientiert, oder?). Wenn Sie mehrere Ebenen in Ihrem Call-Stack kreuzen müssen, bevor Sie auf der richtigen Ebene sind, um den Verstoß gegen Geschäftsregeln ordnungsgemäß zu behandeln, sind Ausnahmen die beste IMO. Dadurch werden auch die Rückgabetypen konsistenter (Sie geben immer denselben Typ zurück, weder falsch noch wahr). Ich werde meine Antwort dies berücksichtigen
greg0ire