Warum werden Funktionsrückgabewerte beim Initialisieren überprüft?
-
In den WinAPI-Tutorials sieht man immer wieder, dass nach RegisterClass(Ex) und CreateWindow(Ex) der Rückgabewert geprüft wird und wenn er falsch ist, wird eben eine Nachricht ausgegeben, dass die Klasse nicht registriert oder das Fenster nicht erstellt werden konnte. Und da frage ich mich nun, wieso das so gemacht wird. Rückgabewerte haben ja prinzipiell schon ihren Sinn, zum Beispiel, wenn die Funktion an unterschiedlichen Stellen mit noch nicht vorhersehbaren Variablenwerten aufgerufen werden kann. Aber wenn ich nun mein konkretes Anwendungsgerüst mit dem einen Hauptfenster erstelle und das Fenster dann auf dem Bildschirm habe, weiß ich doch, dass es funktioniert. Warum also eine Prüfung? Ist es wirklich möglich, dass ich ein Programm erstelle, das erst funktioniert und wo dieselbe Exe dann irgendwo oder irgendwann nicht mehr funktioniert, so dass die Prüfungen trotzdem im Release drin bleiben sollten? Ist es möglich, dass das Registrieren der Fensterklasse oder das Erstellen des Fensters unter bestimmten Voraussetzungen fehlschlägt, während es ansonsten immer geklappt hat?
-
ja
-
Du hast vermutlich auf der TechEd den Talk von Mark Russinovich "Pushing Windows To The Limits" nicht gesehen

-
Heißt das, das ich jede blöde Kleckerfunktion abfangen muss? Wenn ich zum Beispiel ein kleines Spiel mit GDI schreibe, dann muss ich ja quasi bei jedem CreateBitmap, bei jedem Device Context, bei jedem Blitten abfragen, ob das überhaupt funktioniert hat, oder?
-
Ja. (zumindest wenn Du nicht willst, dass Deine Anwendung ohne (oder mit "blöder") Fehlermeldung abstürtzt).
-
Ja.
-
Du musst natürlich nichts testen, wenn Du mit dem Rückgabe Wert leben kannst, den Du bekommst wenn die Funktion fehlschlägt :xmas1: <duck&wech>
-
Das Problem ist ja, dass beim Nichtbeachten das Programm eben nicht abstürzt. Zumindest nicht später: Wenn zum Beispiel irgendeine Grafikfunktion nicht klappt, dann ist da einfach ein Sprite weniger auf dem Bildschirm.
Um das ganze abzufangen und das nicht jedesmal hinschreiben zu müssen, müsste ich wohl sowas wie eine statische Klasse erstellen:class WinApi { public: static void BeliebigeFunktion(int a, int b) { int returnValue = ::BeliebigeFunktion(a, b); if (returnValue == 0) throw WinApiException("void Beliebige", returnValue); } // Andere Funktionen }Und dann könnte ich um das ganze Programm ein try-catch machen. Denn wenn eine Funktion aufgrund dieser internen Windows-Querelen fehlschlägt, gibt es für ein Spiel sowieso keine sinnvolle Aktion, die ausgeführt werden kann, außer es zu beenden. (Es sei denn, ihr habt eine alternative Idee.)
Wie wird das eigentlich in der Praxis gemacht? Wird da der ganze Quellcode mit solchen Abfragen vollgestopft? Vor allem: Schlägt sowas auch wirklich in der Praxis fehl oder ist das mehr eine theoretische Sache, die heutztage vernachlässigt werden kann?