Scheint nicht etwas zu sein, das ein wesentlicher Bestandteil der GAME-Programmierung wäre.
Scheint nicht etwas zu sein, das ein wesentlicher Bestandteil der GAME-Programmierung wäre.
Antworten:
Sie sind 100% essentiell. Möchten Sie, dass Ihr Spiel jedes Mal abstürzt, wenn ein Fehler auftritt? Zugegeben, einige Fehler verursachen immer einen Absturz, aber was ist mit etwas so Einfachem wie einem Netzwerk-Timeout? Wäre es nicht klüger, es dem Spieler zu sagen und ihn erneut versuchen zu lassen oder seine Netzwerkverbindung zu überprüfen?
Sie abzuholen ist sehr einfach.
try
{
//open a network connection and try to get the leaderboard
}
catch(Exception ex) //type of exception, and a variable to access it by
{
//tell the user something happend, and have them try again.
//maybe you jut want to log it.
LogError(ex);
//so we have a record it happend, but the error was really bad! (out of memory) just throw it again if you need to
throw;
}
finally
{
//this happens no matter what. it will run on success and failure
}
try/catch/finallyund benutzt, aber es besteht keine Notwendigkeit , etwas darüber zu lernen throw.
Ich stimme Joes Antwort zu, dass das Behandeln von Ausnahmen eine nützliche Fähigkeit ist, aber ich habe die Erfahrung gemacht, dass sie in der Spieleentwicklung selten verwendet werden.
Ich bin mir bei den Unterschieden in der Implementierung nicht sicher, aber in C ++ ist der Aufwand für das Beibehalten von Stack-Traces, um ein effektives Abwickeln zu ermöglichen, wenn ein "Wurf" auftritt, so ziemlich der einzige Grund, warum sie verpönt sind.
Diese Antwort bietet Ihnen möglicherweise mehr Einblick in die mit der Behandlung von C # -Ausnahmen verbundenen Gemeinkosten.
In Bezug auf die allgemeine Programmarchitektur sind Ausnahmen nicht hilfreich, um die genauen Gründe für einen Absturz zu ermitteln, und es ist schwierig, genau zu bestimmen, wo ein Fehler auftritt. Sie werden sich bis zum Punkt des Fangs entspannen, haben jedoch nur wenige bis gar keine Informationen (abhängig von der Nützlichkeit Ihrer Ausnahme) darüber, wo der Fehler tatsächlich entstanden ist.
Ich würde zustimmen, dass es etwas ist, auf das Sie zurückkommen können.
Es ist vielleicht nicht wesentlich für die "Spielprogrammierung", wie es für die Wartungs- / Supportprogrammierung sein kann. Mit anderen Worten, wenn Sie sich "Spielprogrammierung" als die Disziplin der Erstellung und Bereitstellung des Spiels vorstellen können, werden die Vorteile der Ausnahmebehandlung nach dem Versand im Freien deutlich.
Es gibt jedoch Dinge, die eine Rolle spielen können, wie schnell:
Ihre Protokollierung. Es wird also einen Punkt geben, an dem Sie mit der Formulierung einer Fehlermanagementstrategie beginnen. Wie früh Sie Ihre Strategie formulieren, hängt direkt von der Unterstützung ab, die Sie durch Fehlerberichte und erfasste Protokolleinträge wie "Nullreferenz" erhalten. Ohne den Kontext, den Sie aus der Ausnahme erfassen können, müssen Sie häufig mehr Detektivarbeit leisten, und es ist schwieriger, Fehler zu gruppieren, um die Ähnlichkeiten zu erkennen.
Ihr Patch-System. Wenn Sie Updates veröffentlichen können, haben Sie viel Freiheit, auf die Ausnahmebehandlung zu warten. Gleiches gilt, wenn Ihre Logik eine Web-App ist und Clients nur Browser sind.
Ihre Teamgröße. Wenn Sie ein Ein-Mann-Team sind, haben Sie enorme Freiheit zu warten. Sie kennen Ihren Code. Möglicherweise wissen Sie sogar vorher, dass die Ausnahme auf Ihrer Aufgabenliste stand. Wenn Sie arbeiten und Code mit anderen Entwicklern teilen, wird Ihnen möglicherweise ein Ticket zugewiesen, um den Code eines anderen zu verfolgen, sodass Sie möglicherweise nicht sofort sehen, wo die Ausnahme ausgelöst wird.
Parallelität. Für mich ist dies schwer zu planen, daher ist es möglicherweise nicht die Mühe wert. Ich bin auch der Meinung, dass dies Teil der Robustheit oder Ausfallsicherheit ist. Wenn die Anforderungen plötzliche Abstürze zulassen, haben Sie große Freiheit und warten darauf, Ausnahmen zu beheben. Eine Sache, die Sie bei Threads finden können, ist, dass es leicht ist, nicht deterministisches Verhalten zu erhalten. In diesem Fall möchten Sie möglichst viele Informationen über den Status erfassen, der zum Fehler geführt hat. Dies kann Simulationen in einem Labor von Maschinen, Regressionstests, Protokolle und (Live-) Daten umfassen. Jedes dieser Stücke kann einzeln die anderen bis zu einem gewissen Grad ausgleichen. Wenn Sie beispielsweise unendlich viele Tests haben, sollten Sie in der Lage sein, jeden Logikfehler aufzudecken, und daher keine Ausnahmebehandlung (oder Protokollierung oder etwas anderes) benötigen.
Die Ausnahmebehandlung ist eine sauberere Methode, um unerwartete Fehler von jedem Punkt im Spiel aus zu behandeln. Aber das Schöne daran ist, dass es in Ihrer Codebasis keine Rolle spielt, wie tief Sie im Code sind, um damit umzugehen. Ohne Ausnahmen würde eine Art Fehlerbehandlungsroutine einen Bool oder Int für einen bestimmten Status zurückgeben und dann die verschachtelten Unterroutinen abwickeln, bis Sie zu einem Bereich der obersten Ebene (Ihrer Spielklasse) gelangen und diesen verlassen. Es wird sehr umständlich, Ihren Code zur Fehlerprüfung von einem möglichen Punkt aus zu schreiben, während die Verwendung von Ausnahmen wenig bis gar kein Refactoring erfordert.
Da Ihre Frage XNA-spezifisch ist, ist es wahrscheinlich von Nutzen, zu wissen, wie mit Ausnahmen in einem Xbox-Spiel umgegangen wird, denn wenn ein Spiel dort keine abfängt, haben Sie keine Ahnung, warum es passiert ist. Dieser Artikel zeigt Ihnen eine clevere Möglichkeit, dies zu umgehen, indem Sie Ihr gesamtes Spiel in einem Try / Catch-Block ausführen. Es wird ein neues "ExceptionGame" gestartet, wenn etwas schief geht, und die Details des Fehlers werden im ExceptionGame angezeigt.
Ich weiß nichts über C #, aber hier sind meine drei Cent:
Nein, Ausnahmen sind in keiner Weise wichtig oder wesentlich. Zum größten Teil sind traditionelle Spielprogramme sehr umfangreich bei Fehlerprüfungen und wissen genau, was mit den Daten und Parametern los ist.
Die Ausnahme ist, dass beim Zugriff auf Systemaufrufe Ausnahmen ausgelöst werden und das Abfangen dieser Ausnahmen sehr gut dokumentiert ist. Sie können try / catch wie eine Black Box verwenden, bis Sie anfangen, Ausnahmen selbst intensiver zu verwenden.
Das ganze Try / Catch-Ding ist jedoch sehr einfach zu erlernen. Sobald Sie sich mit C # vertraut gemacht haben, können Sie sehen, wo Ausnahmen sinnvoll sind, und Sie können sie auf natürliche Weise in Ihren eigenen Code einfügen.
Vorausgesetzt natürlich, Sie fangen gerade erst an. Wenn Sie C # nach anderen Sprachen lernen, sollten Sie Ausnahmen aufgreifen und nicht bis später warten.
Ich glaube, es hängt von der Art Ihres Spielcodes ab. Gibt es Bereiche in Ihrem Ausführungsfluss, in denen Dinge fehlschlagen können? Wird Ihr Code zu 100% verarbeitet? Wenn der Code nicht fehlschlagen kann, wenn Sie die Post-Bedingung kennen und sicher sind, ist die Ausnahmebehandlung von geringem Nutzen und würde einfach den Ressourcenverbrauch erhöhen, um sie ohne Grund zu überprüfen. Der Großteil des Codes weist jedoch Situationen auf, in denen Fehler auftreten können. Insbesondere in der Spieleentwicklung würde einem Spiel, wenn es vorhersehbar ist, höchstwahrscheinlich die Essenz eines Spiels fehlen. Unabhängig von der Verwendung in der Spieleentwicklung MÜSSEN Sie sich dessen bewusst sein und wissen, wie Sie es verwenden. Aber wenden Sie es an, wo es gebraucht wird.
Möchten Sie wissen, was in Ihrem Programm schief gelaufen ist, ohne Haltepunkte einzufügen oder Ihren gesamten Code zu betrachten? Wenn ja, helfen Ihnen try-catch-Anweisungen dabei. Hier erfahren Sie, was mit voreingestellten Fehlertypen schief gelaufen ist. Wenn Sie also diese Anweisungen tatsächlich lernen und wissen, welcher Fehler für was steht, können Sie Ihren Code effektiv und problemlos debuggen.
Gut,
Normalerweise tendiert objektorientierte Software dazu, Ausnahmen für die Meldung von Fehlern im laufenden Prozess zu verwenden. Wenn etwas passiert, das mit der aktuellen Methode nicht behoben werden kann, sollte eine Ausnahme ausgelöst werden und jemand in der höheren Klasse dieses Problem behandeln lassen. Wenn Sie dies tun, sind Ihre Hauptverarbeitungsmethoden (die spezifischeren) viel sauberer, ohne dass Fehler behandelt werden müssen, die nicht behoben werden können.
Aber normalerweise werden in der Spieleentwicklung keine Ausnahmen ausgelöst, weil Sie die gesamte Umgebung entwerfen. Wenn Sie Ihre Engine entwerfen, werden Sie zwar Ausnahmen für E / A-Funktionen verwenden, aber in der Szene ist es beispielsweise unwahrscheinlich, dass Sie sie verwenden. Ich finde heraus, dass es besser ist, zu einer Liste von Dingen hinzuzufügen, die gelöst werden müssen, als einen Fehler auszulösen. Zum Beispiel haben Sie ein Client / Server-Spiel. Im Client haben Sie etwas bemerkt, das schief gelaufen ist. Ich finde, dass es (für mich) besser ist, diesen Fehler zu einer Liste von Fehlern hinzuzufügen, die behoben werden müssen, anstatt die Sequenz zu unterbrechen. Auf diese Weise können Sie diesen Fehler einfach überspringen und keine Ausnahme auslösen, aber jemand wird versuchen, dieses Problem zu beheben.
Denken Sie jedoch daran, dass in jeder OO-Software, mit der Sie arbeiten, immer Ausnahmen verwendet werden. Es ist wirklich gut zu lernen, sehr nützlich und überhaupt nicht schwer.