2016-01-11 15 views
6

Was ist der Grund dafür, warum std :: stof, std :: stod, std :: stold throw Ausnahmen?Warum sind std :: stof, std :: stod und std :: stold handle Fehler mit Ausnahmen?

http://en.cppreference.com/w/cpp/string/basic_string/stof

Eingabefehler sind ein häufig verwendetes Beispiel für, wenn Fehler über Behandlung von Ausnahmen sind eine schlechte Passform (in der Regel mit der schrulligen Kreis Argumentation von „außergewöhnlichen Umständen“ ausdrückte, aber immer noch ein gutes Beispiel). Es ist nicht so, als ob andere Fehlerbehandlungsmechanismen in der C++ - Standardbibliothek irgendwie verboten sind. Zum Beispiel zeigt ein anderer C++ 11-Neuling, die std::unordered_map::insert-Familie, einen Fehler unter Verwendung des zweiten Elements in einem std::pair<iterator,bool> Rückgabetyp an. Fehler innerhalb einer std::unordered_map::insert-Funktion scheint viel "außergewöhnlicher" als ein Eingabefehler. Ohne zu versuchen, einzufügen, ist es möglich zu garantieren, dass ein Insert erfolgreich ist, aber ohne zu analysieren, ist es nicht möglich zu garantieren, dass das Parsen erfolgreich ist.

Ich frage mich nur, was das Grundprinzip zu der Zeit war, als diese Funktionen in den Standard aufgenommen wurden. Hoffentlich wird es irgendwo veröffentlicht oder ein Komitee-Mitglied kann vorbeikommen und etwas Licht in die Sache bringen. Ich verlange keine umfassende Abhandlung über die Vor- und Nachteile von Ausnahmen gegenüber anderen Mechanismen.

+0

Es ist offensichtlich, die Tradition der C++ - Standardbibliothek als notorisch schlecht beim Parsing zu halten ... Betrachten Sie zB auch die Signatur von 'strto' *, wenn Sie irgendeine dieser Funktionen in einem handgeschriebenen rekursiven Descent-Parser verwenden , müssen Sie eine Kopie der verbleibenden Eingabe erstellen, bevor Sie sie aufrufen. Oder bedenken Sie die schlechte Zusammensetzbarkeit des Stream-Inputs. Für ein ordentliches Parsing haben Sie zwei Möglichkeiten, rollen Sie Ihre eigenen oder verwenden Sie eine Drittanbieter-Bibliothek. ein Parser-Generator. –

Antwort

6

Das Originalpapier, N1803: Simple Numeric Access verwendet Ausnahmen. Das Papier erklärt jedoch nichts darüber, woher irgendein Teil ihres Designentwurfs kommt (wie warum sie vollständig Zuweiser ignorieren!). Die späteren Revisionen dazu (N1982, N2408) sagen auch nichts darüber aus, warum sie Ausnahmen auslösen. Wenn es darüber hinaus noch eine weitere Aufzeichnung gibt, ist mir das nicht bekannt.

Allerdings kann ich eine Vermutung riskieren. Wir können sehen, dass der allererste Entwurf des Papiers Ausnahmen wirft. Und es scheint nicht, dass dies jemals strittig war. Dies ist wahrscheinlich auf die Ansicht zurückzuführen, dass Ausnahmen die Standardmethode zum Anzeigen des Fehlers einer Operation in C++ und insbesondere der C++ - Standardbibliothek sind.

Einige Standardbibliothekstypen haben andere Fehlermechanismen (Iostreams). Im Allgemeinen sind Ausnahmen der Standardfall.

+0

Ich glaube, dass die Paar-Returning-Insert-Funktionen * vorhandene Elemente nicht mit dem gleichen Schlüssel überschreiben. Sie geben nur einen Iterator zurück, so dass Sie überschreiben können, wenn Sie dies wünschen. In gewisser Weise war die Funktion in einem solchen Fall nicht erfolgreich, weil nichts eingefügt wurde. Wenn dies außerhalb der Standardbibliothek wäre, würde ich sagen, dass der Name "Einfügen" schlecht gewählt wurde. Angesichts der starken Präferenz von "kurz" gegenüber "deskriptiv" in der Standardbibliothek, verstehe ich, warum sie nur mit "einfügen" festgefahren sind. –

Verwandte Themen