Ich denke, alle Antworten, die erklären, dass Sie kein Flag haben sollten, das steuert, ob eine Ausnahme ausgelöst wird oder nicht, sind gut. Ihr Rat wäre mein Rat an alle, die das Bedürfnis haben, diese Frage zu stellen.
Ich wollte jedoch darauf hinweisen, dass es eine sinnvolle Ausnahme von dieser Regel gibt. Sobald Sie fortgeschritten genug sind, um mit der Entwicklung von APIs zu beginnen, die von Hunderten anderer Personen verwendet werden, kann es vorkommen, dass Sie ein solches Flag bereitstellen möchten. Wenn Sie eine API schreiben, schreiben Sie nicht nur an die Puristen. Sie schreiben an echte Kunden, die echte Wünsche haben. Teil Ihrer Aufgabe ist es, sie mit Ihrer API zufrieden zu stellen. Das wird eher zu einem sozialen Problem als zu einem Programmierproblem, und manchmal schreiben soziale Probleme Lösungen vor, die als eigene Programmierlösungen nicht ideal wären.
Möglicherweise haben Sie zwei unterschiedliche Benutzer Ihrer API, von denen einer Ausnahmen wünscht und einer dies nicht tut. Ein Beispiel aus der Praxis, in dem dies auftreten könnte, ist eine Bibliothek, die sowohl in der Entwicklung als auch auf einem eingebetteten System verwendet wird. In Entwicklungsumgebungen möchten Benutzer wahrscheinlich überall Ausnahmen haben. Ausnahmen sind sehr beliebt für den Umgang mit unerwarteten Situationen. In vielen eingebetteten Situationen sind sie jedoch verboten, da sie zu schwierig sind, um Einschränkungen in Echtzeit zu analysieren. Wenn Sie sich nicht nur um die durchschnittliche Zeit für die Ausführung Ihrer Funktion kümmern , sondern auch um die Zeit, die für einen einzelnen Spaß benötigt wird, ist die Idee, den Stapel an einem beliebigen Ort abzuwickeln, sehr unerwünscht.
Ein echtes Beispiel für mich: eine Mathematikbibliothek. Wenn Ihre Mathematikbibliothek eine Vector
Klasse hat, die es unterstützt, einen Einheitsvektor in dieselbe Richtung zu erhalten, müssen Sie in der Lage sein, durch die Größe zu dividieren. Wenn die Größe 0 ist, haben Sie eine Division durch Null-Situation. In der Entwicklung möchten Sie diese fangen . Sie wollen wirklich keine überraschende Division durch Nullen. Das Auslösen einer Ausnahme ist hierfür eine sehr beliebte Lösung. Es passiert fast nie (es ist wirklich außergewöhnliches Verhalten), aber wenn es passiert, möchten Sie es wissen.
Auf der eingebetteten Plattform möchten Sie diese Ausnahmen nicht. Es wäre sinnvoller, eine Überprüfung durchzuführen if (this->mag() == 0) return Vector(0, 0, 0);
. Tatsächlich sehe ich das in echtem Code.
Denken Sie jetzt aus der Perspektive eines Unternehmens. Sie können versuchen, zwei verschiedene Methoden zur Verwendung einer API beizubringen:
// Development version - exceptions // Embeded version - return 0s
Vector right = forward.cross(up); Vector right = forward.cross(up);
Vector localUp = right.cross(forward); Vector localUp = right.cross(forward);
Vector forwardHat = forward.unit(); Vector forwardHat = forward.tryUnit();
Vector rightHat = right.unit(); Vector rightHat = right.tryUnit();
Vector localUpHat = localUp.unit() Vector localUpHat = localUp.tryUnit();
Dies entspricht den Meinungen der meisten Antworten, ist jedoch aus Unternehmenssicht unerwünscht. Embedded - Entwickler haben ein lernen Stil der Codierung und Entwicklung Entwickler müssen eine andere lernen. Dies kann ziemlich lästig sein und zwingt die Menschen zu einer Denkweise. Möglicherweise noch schlimmer: Wie können Sie beweisen, dass die eingebettete Version keinen Code zum Auslösen von Ausnahmen enthält? Die Throwing-Version kann sich leicht einfügen und irgendwo in Ihrem Code verstecken, bis ein teures Failure Review Board sie findet.
Wenn Sie andererseits ein Flag haben, das die Ausnahmebehandlung ein- oder ausschaltet, können beide Gruppen den exakt gleichen Codierungsstil erlernen. In vielen Fällen können Sie sogar den Code einer Gruppe in den Projekten der anderen Gruppe verwenden. unit()
Wenn Sie bei Verwendung dieses Codes tatsächlich daran interessiert sind, was in einem Fall der Division durch 0 geschieht, sollten Sie den Test selbst geschrieben haben. Wenn Sie es also auf ein eingebettetes System verschieben, auf dem Sie nur schlechte Ergebnisse erzielen, ist dieses Verhalten "normal". Aus geschäftlicher Sicht trainiere ich meine Codierer jetzt einmal und sie verwenden in allen Bereichen meines Geschäfts dieselben APIs und Stile.
In den allermeisten Fällen möchten Sie den Ratschlägen anderer folgen: Verwenden Sie tryGetUnit()
für Funktionen, die keine Ausnahmen auslösen, ähnliche oder ähnliche Redewendungen und geben Sie stattdessen einen Sentinel-Wert wie null zurück. Wenn Sie der Meinung sind, dass Benutzer sowohl Ausnahmebehandlungs- als auch Nicht-Ausnahmebehandlungscode in einem einzigen Programm nebeneinander verwenden möchten, bleiben Sie bei der tryGetUnit()
Notation. Es gibt jedoch einen Eckfall, in dem die Realität des Geschäfts die Verwendung einer Flagge verbessern kann. Wenn Sie sich in diesem Eckfall befinden, haben Sie keine Angst, die "Regeln" auf der Strecke zu lassen. Dafür gibt es Regeln!