2010-03-12 20 views
10

Was sind die Vor- und Nachteile der Verwendung eines der folgenden Ansätze zum Herausziehen eines Doppels von einem Objekt? Darüber hinaus nur persönliche Vorlieben, Probleme Ich bin auf der Suche nach Feedback auf einfache Debugging umfassen, Performance, Wartbarkeit usw.Pro und Kontra von TryCatch versus TryParse

public static double GetDouble(object input, double defaultVal) 
{ 
    try 
    { 
     return Convert.ToDouble(input); 
    } 
    catch 
    { 
     return defaultVal; 
    } 
} 

public static double GetDouble(object input, double defaultVal) 
{ 
    double returnVal; 
    if (double.TryParse(input.ToString(), out returnVal)) 
    { 
     return returnVal; 
    } 
else 
    { 
     return defaultVal; 
    } 
} 

Antwort

17
  • TryParse schneller sein wird als eine Ausnahme
  • TryParse etwas zeigt, fangen erwartet - wir haben hier nichts passiert ist außergewöhnlich, es ist nur, dass Sie Ihre Daten vermuten, dass nicht gültig sein kann.
  • TryParse ist nicht Ausnahme mit Handling für die normale Steuerung fließen

Grundsätzlich gehen mit TryParse :)

By the way, können Sie Ihren Code neu geschrieben werden als:

public static double GetDouble(object input, double defaultVal) 
{ 
    double parsed; 
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal; 
} 
+0

GM Jon, Was das ist interne Implementierung von tryparse()? ist es so: versuchen { Parse(); Rückkehr wahr; } catch (Ausnahme) { Rückgabe false; } – Sunil

+2

TryParse umwandelt String (eigentlich ein Zeichen *), versucht, diese Zeichenfolge (über Zeichenvergleiche) zu einer Nummer zu analysieren, führt dann verschiedene andere Überprüfungen (Bereich usw.) durch, um sicherzustellen, dass die Nummer der richtige Typ ist. Es gibt keinen Versuch catch Block um es :) –

4

TryParse ist weise effizienter als TryCatch Leistung.

2

Having Die Parse-Methoden, die bei schlechten Eingaben Ausnahmen auslösen, waren ein Konstruktionsfehler. Falsche Eingabe ist erwartet Verhalten, wenn Sie Daten von einem Benutzer aufnehmen. Exception-Werfen ist teuer, es ist nicht etwas, das Sie routinemäßig in Ihrem Code passieren möchten.

Zum Glück erkannte Microsoft ihren Fehler und fügte die TryParse-Methoden hinzu. TryParse tut nicht die Overhead der Ausnahme werfen auf schlechte Eingabe werfen, aber der Nachteil ist, dass es zwei Stücke von Daten zurückgibt, so fühlt es sich ein bisschen peinlich zu bedienen.

Nun, wenn sie nicht die fehlerhafte Parse-Implementierung in erster Linie erstellt hätten, würde TryParse einfach als Parse bezeichnet werden.

1

TryParse ist schneller und in der Regel besser, aber ich würde den TryCatch Ansatz im Rahmen und Back-End-Programmierung vorschlagen, weil Sie mehr Informationen an den Client über den Fehler geben können:

public double GetAge() 
{ 
    try 
    { 
     var input = _dataProvider.GetInput(); 
     return Convert.ToDouble(input); 
    } 
    catch(Exception ex) 
    { 
     throw new MyBackendException(ex); 
    } 
} 
+0

Sie konnten TryParse immer noch benutzen und Ihre eigene Ausnahme auf schlechten Daten erhöhen. In der Tat sollten Sie es so machen, um nichts weiter zu verfolgen. –

+0

Ok, aber Sie würden nur eine allgemeine Nachricht über "schlechte Daten" haben und Sie werden die Information darüber verlieren, warum Daten schlecht sind. Informationen, die sich in einer InvalidCastException oder einer FormatException befinden oder. Programmieren auf einem gegebenen Rahmen Ich möchte so viel wie möglich über einen Fehler wissen. Wie auch immer, wenn schlechte Daten von einem Web-Service oder vom Speicher kommen können, ist es kein "erwartetes Verhalten" und eine IMO-Ausnahme muss geworfen werden. – onof

Verwandte Themen