java eingabefenster Ist es in Ordnung, etwas zu versuchen/zu fangen, nur um zu überprüfen, ob eine Ausnahme ausgelöst wurde oder nicht?




joptionpane input dialog (8)

Ist es eine gute Möglichkeit, etwas nutzloses zu versuchen, nur um zu sehen, ob eine bestimmte Ausnahme von diesem Code ausgelöst wird?
Ich möchte etwas tun, wenn die Ausnahme ausgelöst wird, und sonst nichts.

try {  
    new BigDecimal("some string"); // This do nothing because the instance is ignored  
} catch (NumberFormatException e) {  
    return false; // OK, the string wasn't a well-formed decimal  
}  
return true;

Es gibt zu viele Vorbedingungen zum Testen und der Konstruktor BigDecimal () überprüft sie immer alle, daher scheint dies die einfachste Methode zu sein.


Im Allgemeinen sollte diese Praxis vermieden werden. Aber da es keine Utility-Methode isValidBigDecimal(..) gibt, ist das der isValidBigDecimal(..) Weg.

Wie Peter Tillemans in den Kommentaren notierte, isValidBigDecimal(..) diesen Code in eine Utility-Methode namens isValidBigDecimal(..) . Somit ist Ihr Code unabhängig von der Art der Gültigkeitsbestimmung und Sie können sogar später zu einer anderen Methode wechseln.

Boris Pavlović schlug eine Option vor, um zu überprüfen, ob eine Bibliothek von Drittanbietern (commons-lang) verwendet wird. Es gibt noch eine weitere nützliche Methode, die ich benutze, wenn ich Nummern verifizieren muss - NumberUtils.isNumber(..)


Die Leistung ist möglicherweise nicht groß und die Syntax ist ausführlich, aber der Code ist sehr genau, was er tut. Es gibt keine Überschneidungen zwischen Kontrolle und Verwendung, was immer ein großes Problem darstellt.

(Beachten Sie, dass diese spezielle Art der Konvertierung in und aus Strings wirklich zum Debuggen und zur internen Konfiguration dient. Es behandelt keine Gebietsschemata und andere menschenorientierte Überlegungen. Die Verwendung in Dateiformaten und Drahtprotokollen führt zu einer starken Abhängigkeit von der von der Klasse.)


Sicher warum nicht. So überprüfen wir, ob eine vom Kunden angegebene E-Mail-Adresse korrekt formatiert ist:

try
{
    MailMessage m = new MailMessage(from, to, subject, body);
    return true;
}
catch(SmtpFailedRecipientsException ex)
{
    return false;
}

Nun können sich die Leute über die Leistung oder Angemessenheit der Struktur streiten, aber sie vergessen die Kompromisse in der Einfachheit:

  • Der obige Code wird die von .NET akzeptierten EXACT-Datenformate abfangen. Jeder, der E-Mail-Adressen geparst hat, weiß, dass es große Unterschiede gibt, was eine korrekt formatierte E-Mail-Adressstruktur angeht. Dieser Code garantiert die Validierung von E-Mail-Adressstrukturen, so wie .NET es mag, und nicht so, wie es meiner Meinung nach sein sollte.
  • Die Ausnahme erfasst mehrere Anwendungsfälle, nicht nur die Korrektheit einer grundlegenden Datenstruktur. Es wird mehrere Benutzer in den Feldern CC, BCC und TO validieren, was mit handgeschriebenem Code unhandlich wird.

Wie oben bereits erwähnt, wird dieser Code am besten in eine separate Dienstprogrammklasse abstrahiert und nicht mit Ihrem Hauptcode gemischt.


Es ist nichts falsch daran, dies zu tun; Schließlich sagen Befürworter einer bestimmten anderen Sprache gern: "Es ist leichter, sich zu entschuldigen, als um Erlaubnis zu bitten", das heißt, es ist leichter zu warten, dass etwas scheitert und sich damit auseinandersetzt, als Fehler vollständig zu vermeiden. In diesem Fall, da es keine Alternative gibt, gehen Sie unbedingt dafür.


Es gibt zwei bekannte Methoden zum Überprüfen von Vorbedingungen.

LBYL: Schau, bevor du springst

Dieser Codierungsstil testet explizit vor Bedingungen, bevor Aufrufe oder Suchvorgänge ausgeführt werden. Dieser Stil steht im Gegensatz zum EAFP-Ansatz und ist durch das Vorhandensein vieler if-Anweisungen gekennzeichnet.

EAFP: Leichter um Verzeihung bitten als Erlaubnis.

Dieser allgemeine Codierungsstil geht von der Existenz gültiger Schlüssel oder Attribute aus und fängt Ausnahmen ab, wenn sich die Annahme als falsch herausstellt. Dieser saubere und schnelle Stil zeichnet sich durch das Vorhandensein vieler try und except Statements aus. Die Technik kontrastiert mit dem LBYL-Stil, der vielen anderen Sprachen wie C. gemeinsam ist.

EAFP ist immer eine gute Idee für Sprachen, die Ente tippen.

Es hängt eindeutig davon ab, was Sie tun möchten ... Wenn Sie sich nicht sicher sind, welche Art von Objekt manipuliert werden soll, verwenden Sie EAFP.


Sie müssen bedenken, dass die Konstruktion des Exception-Objekts in Bezug auf Zeit und Ressourcen für die JVM teuer ist , da es die Strack-Trace erstellen muss.

Was Sie vorschlagen, ist eine einfache, aber ressourcenintensive Möglichkeit, das Problem zu lösen.

Ob diese Lösung akzeptabel ist oder nicht, hängt von der Verwendung dieser Funktion und von Ihren Effizienzanforderungen ab.



Try / Catch-Blöcke sollten niemals für Logik verwendet werden.





exception