Fehlerbehandlung bei falschen Argumenten in der Methode oder beim Aufrufer?



  • Wenn ich z.B. eine Methode habe, die den Ganzzahlwert von 0-300 akzeptiert und ich nehme dafuer ein unsigned int, sollte dann der Aufrufer dafuer sorgen, dass der Wert in diesem Bereich liegt, oder soll die aufgerufene Methode dies testen?



  • Der Aufrufer soll es testen, die Funktion macht im Debugmode aber noch einmal einen Check.



  • CppNeuland schrieb:

    Wenn ich z.B. eine Methode habe, die den Ganzzahlwert von 0-300 akzeptiert und ich nehme dafuer ein unsigned int, sollte dann der Aufrufer dafuer sorgen, dass der Wert in diesem Bereich liegt, oder soll die aufgerufene Methode dies testen?

    Die Antwort mag dir blöd erscheinen: Aber im wesentlichen kommt es auf die Situation und Vorgaben an. Grundsätzlich schadet es nie mit assert zu arbeiten, was aber nur in einer Debugversion ausgeführt wird. Jenseits von assert halte ich es wie folgt:

    Unter der Prämisse von C++ (Die C++ Standardbibliothek prüft Beispielsweise viele Fehlerfälle nicht [oder mit assert], da es hier um Performance geht. Man erwartet das der Aufrufer weiß was er tut) würde ich versuchen, möglichst früh eine Fehlerquelle abzufangen, oder die Prüfung zumindest auf Schnittstellen beschränken, die ich nach außen gebe (z.B. an den Schnittstellen einer Bibliothek).

    Innerhalb eines Programms stellt sich die Frage: Woher kommt der Wert? Wenn dieser aus einer Eingabe stammt, würde ich die Eingabe überprüfen, aber nicht jeder einzelnen Methode wieder eine Abfrage spendieren.

    Anders sieht es aus wenn für mich die Performance zweitrangig ist (bzw. vom Kunden die Sicherheit höher eingestuft wird), dies kommt aber auch darauf an, was Fehler an dieser Stelle bewirken. Wenn der Fehler z.B. keine gravierenden Auswirkungen hat (z.B. einzelne falsch gezeichnete Pixel in einer Grafik) ist es etwas anderes, als wenn es um Geldbuchungen oder eine AKW-Steuerung geht.



  • Ok danke, das hilft mir erst mal weiter. In meinem Falle geht es um Pixeldaten, Performance ist spaeter wichtig, jedoch nicht bei der Entwicklung. Ich denke ich werde dort Asserts in den Methoden nehmen. Wenn am Ende keine Asserts mehr bemueht werden muessen, dann sind die Algos soweit richtig implementiert. Auf mathematische Verifikation des Codes habe ich keine Lust und auch nicht die grosse Kompetenz in dem Bereich, daher muessen solche Tests reichen.


Log in to reply