Ist es wichtig, dass ich Try / Catch- und finally-Anweisungen für die Spielprogrammierung lerne, oder kann ich darauf zurückkommen? [geschlossen]

7

Scheint nicht etwas zu sein, das ein wesentlicher Bestandteil der GAME-Programmierung wäre.

Geno
quelle
22
Eigentlich ist es wichtig, dass Sie ALLE Anweisungen lernen. Es ist nicht so, dass einige Teile der Sprache "optional" sind.
Nevermind
22
Und in Bezug auf die Spielprogrammierung ist try / catch / finally alles andere als das Schwierigste, was Sie angehen müssen.
Jari Komppa
7
Dies ist keine gute Frage: gamedev.stackexchange.com/faq#dontask . Gibt es hier tatsächlich ein zu lösendes Problem?
Tetrad
2
Es gibt dort ein C # - und ein XNA-Tag - dann ist es absolut notwendig. Heck, wenn Sie jemals XBLIG gehen, müssen Sie sich mit Dutzenden von (gut dokumentierten) Ausnahmen nur für die Standard-Xbox Live-Behandlung befassen, wenn nichts anderes ...
Oskar Duveborn
2
@Jari: Es gibt einen immensen Unterschied zwischen der Frage "Wann und wie soll ich Ausnahmen verwenden?" und "Muss ich lernen, was Ausnahmeschlüsselwörter tun?"

Antworten:

24

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
}

quelle
3
Lassen Sie mich seine Antwort umformulieren. Sie müssen lernen, wie man sie benutzt try/catch/finallyund benutzt, aber es besteht keine Notwendigkeit , etwas darüber zu lernen throw.
Ali1S232
2
Tatsächlich wird der letzte Teil nicht jedes Mal ausgeführt, siehe stackoverflow.com/questions/4193493/finally-block-not-running
UrbanEsc
8

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.

Jack Smith
quelle
2
In c ++ hast du recht, werfen und fangen werden nicht wirklich verwendet, aber in c # ist es eine andere Geschichte, sogar Casting wird werfen, wenn etwas schief geht!
Ali1S232
4
Ich bin absolut anderer Meinung, Netzwerksitzungen, Speicherung (Speichern), Einrichten des Rendergeräts, all diese elementaren Dinge lösen oft Ausnahmen aus, und die Benutzer erwarten, dass Sie damit richtig umgehen.
Roy T.
1
Gajet: Da C # viel weniger für die "richtige" Spieleentwicklung verwendet wird, ist das ein weiteres Problem: P @Roy T. Ich persönlich habe noch nie ein Spielprogrammierungsframework verwendet, das Ausnahmen verwendet, um den Programmierer über einen Fehler zu informieren, nur solche, die dies tun Geben Sie Fehlercodes zurück oder hinterlassen Sie einen NULL-Zeiger.
Jonathan Connell
@ JonathanConnell Ich denke, das ist eine sehr altmodische Ansicht. Die ganze Idee von Ausnahmen ist, dass die Fehlerprüfung einfacher und einfacher wird und dass Sie wichtige Fehler nicht vergessen können. Es reduziert die Anzahl der ernsthaft schwer zu debuggenden Fehler, indem es sich an "frühzeitig ausfallen" und an die Anzahl der Kesselplatten hält, wenn Aussagen, die mit ein paar Try-Catches durchgeführt werden könnten, da die meisten Stellen, die fehlschlagen können (hauptsächlich E / A), nahe beieinander liegen . Ich sehe / stimme zu, dass Funktionen in der Standardspielschleife nicht oft Ausnahmen auslösen, sondern einfach, weil sie nicht fehlschlagen können. Ausnahmen treten hauptsächlich bei E / A- und Netzwerkteilen eines Spiels auf.
Roy T.
Als in # Ausnahme C Handhabung ist grundsätzlich frei (siehe die zweite Antwort hier stackoverflow.com/questions/52312/... ) Ausnahmen ist teuer , obwohl zu erzeugen, aber das ist in Ordnung , da es nur in Ausnahmefällen geschehen soll. Wenn Sie 1000 Ausnahmen pro Frame generieren, stimmt etwas nicht.
Roy T.
2

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.

Muster
quelle
2

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.

ChrisC
quelle
2

Ich weiß nichts über C #, aber hier sind meine drei Cent:

  1. Das Paradigma für die Behandlung von Ausnahmen mit try / catch / finally ist aus gutem Grund weit verbreitet: Es bietet einen hervorragenden Rahmen für den Umgang mit Ausnahmen in Ihrem Code.
  2. Wenn Sie eine bestimmte Sprache verwenden, sollten Sie alle Anweisungen lernen und wissen, wie man sie verwendet. Andernfalls ist Ihr Code eine Kombination aus verwirrend, fehlerhaft und ineffizient. Es wird viel über das Design von Programmiersprachen nachgedacht, und der Versuch, ein Programm zu schreiben, ohne alle verfügbaren Tools zu verwenden, ist einfach ... albern.
  3. Nicht abfällig zu sein, aber es gibt viele herausfordernde Aspekte der Spieleentwicklung, und der Versuch, dies mit der Einstellung "Ich werde nur lernen, was ich unbedingt tun muss" zu tun, wird nicht gut enden. Sie sollten die Reise zu Ihrem Ziel, ein Spiel zu entwickeln, besser nutzen, um so viel wie möglich zu lernen.
mdunsmuir
quelle
1

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.

Patrick Hughes
quelle
3
Nein, Ausnahmen sind in einer sehr wichtigen Hinsicht von entscheidender Bedeutung. Das Verstehen und Verwenden von Try-Catch-Throw kann Ihre Debugging-Zeit leicht verzehnfachen.
Nevermind
1
Ausnahmen können optional sein, wenn wir über C ++ sprechen, aber nicht über c #.
Jari Komppa
1
Ich muss nicht zustimmen. Solide Spielprogramme existierten lange vor Ausnahmen und existieren bis heute ohne sie, komplexe Spiele, die von großen Verlagen auf 48 Stunden ununterbrochene Laufzeit überprüft werden und nicht nur kleine Spielzeugtitel. Wenn Sie argumentieren, dass Ausnahmen ein wesentlicher Bestandteil der Logik sein sollten, die das Spiel ausführt, dann könnten Sie entweder Ausnahmen missbrauchen oder die Behauptung vergessen, was in der Tat ein wichtiges Debugging-Tool ist.
Patrick Hughes
1
@Patrick Hughes Sie können ein "solides Spielprogramm" schreiben, ohne etwas anderes als den Base x86-Assembler zu verwenden. Das heißt nicht, dass du es solltest . Wenn wir über C # sprechen, sind Ausnahmen ein wesentlicher und sehr wichtiger Teil der Sprache. (Behauptungen, OTOH, sind überhaupt nicht Teil der Sprache, obwohl ich ihre Nützlichkeit nicht bestreiten kann)
Nevermind
2
Ich verneige mich vor der kollektiven Weisheit dieser Foren! Ich werde meine Antwort nicht bearbeiten, sondern sie zurücklassen, um daran zu erinnern, dies nicht zu tun, und die besten Antworten selbst befolgen, falls ich jemals tiefer in C # =) eintauchen sollte
Patrick Hughes
1

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.

Mike
quelle
1

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.

Kiran
quelle
0

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.

SHiRKiT
quelle