ゲームプログラミングのTry / CatchとFinalsのステートメントを学ぶことは不可欠ですか、それとも戻ってくることができるものですか?[閉まっている]


7

GAMEプログラミングの本質的な部分とは思えない。


22
実際には、すべてのステートメントを学ぶことが不可欠です。「オプション」である言語の一部があるようではありません。
Nevermind

22
ゲームプログラミングに関しては、try / catch / finallyは、取り組む必要のある最も難しいことからはほど遠いものです。
Jari Komppa、2011

7
これは良い質問ではありません:gamedev.stackexchange.com/faq#dontask。ここで実際に解決すべき問題はありますか?
テトラッド2011

2
C#とXNAタグがそこにあります-それは絶対に不可欠です。えっと、XBLIGに行くなら、標準のXbox Live処理だけのために(十分に文書化された)何十もの例外に対処しなければなりません...
Oskar Duveborn

2
@Jari:「いつ、どのように例外を使うべきか?」という質問には大きな違いがあります。および「例外キーワードの機能を学ぶ必要がありますか?」

回答:


24

彼らは100%不可欠です。エラーが発生したときにゲームをクラッシュさせますか?確かに、いくつかのエラーは常にクラッシュを引き起こしますが、ネットワークタイムアウトのような単純なものはどうでしょうか。プレーヤーに伝えてもう一度試すか、ネットワーク接続を確認するほうが賢明ではないでしょうか?

それらを拾うことは非常に簡単です。

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
}

3
私はあなたが彼の答えを修正してください聞かせて必要な使用方法を学習しtry/catch/finally、それらを使用しますが、ありません必要学ぶがthrow
Ali1S232 2011

2
実際には、最終的部分が毎回実行されません、見stackoverflow.com/questions/4193493/finally-block-not-running
UrbanEsc

8

例外処理は学習に役立つスキルであるというジョーの回答には同意しますが、ゲーム開発でめったに使用されないのは私の経験です。

実装の違いはよくわかりませんが、C ++では、「スロー」が発生したときにスタックトレースを維持して効果的な巻き戻しを可能にするためのオーバーヘッドが、眉をひそめる唯一の理由です。

この回答は、C#例外処理に関連するオーバーヘッドについての洞察を提供する可能性があります。

一般的なプログラムアーキテクチャの観点では、例外はクラッシュの正確な理由を特定するのに役立ちません。また、エラーが発生している場所を正確に特定するのは面倒です。キャッチのポイントまでくつろぎますが、エラーの実際の発生場所に関する情報は(例外の有用性によって異なりますが)ほとんどありません。


2
C ++では正しい、スローとキャッチは実際には使用されていませんが、C#では別の話です。
Ali1S232 2011

4
私は強く同意しません、ネットワークセッション、ストレージ(保存)、レンダリングデバイスのセットアップ、これらすべての基本的なことは例外をスローすることが多く、ユーザーはこれを適切に処理することを期待しています。
ロイT.

1
Gajet:C#は「適切な」ゲーム開発にあまり使用されていないので、それは別の問題です:P @Roy T.例外を使用してプログラマーにエラーを通知するようなゲームプログラミングフレームワークを個人的に使用したことはありません。エラーコードを返すか、NULLポインタを残してください。
ジョナサンコネル

@JonathanConnell私はそれが非常に昔ながらの見方だと思います。例外の全体的な考え方は、エラーチェックがより簡単で簡単になり、重要なエラーを忘れることができないということです。失敗する可能性のあるほとんどの場所(主にIO)が近接しているため、「早期に失敗する」ことを厳守することで、デバッグが非常に困難なエラーの量と、数回の試行で実行できるif文の量を減らすことができます。 。標準のゲームループの関数は例外をスローしないことが多いと思いますが、単に失敗することがないためです。例外は主にゲームのIOとネットワークの部分で発生します。
ロイT.

C#のAlsの例外処理は基本的に無料です(2番目の回答はこちらをご覧くださいstackoverflow.com/questions/52312/…)例外の生成はコストがかかりますが、例外的な状況でのみ発生するため、問題ありません。フレームごとに1000の例外を生成している場合は、何かが深刻な問題です。
ロイT.

2

それはあなたが戻ってくることができるものであることに同意します。

メンテナンス/プログラミングをサポートするための「ゲームプログラミング」は、おそらく不可欠ではありません。言い換えれば、「ゲームプログラミング」をゲームの作成と配信の分野と考えることができる場合、例外処理のメリットは出荷に明らかになります。

そうは言っても、どれだけ早く役割を果たすことができるものがあります:

  • ロギング。したがって、エラー管理戦略の策定を開始するポイントがあります。戦略をどのくらい早く作成するかは、バグレポートや「null参照」などのキャプチャされたログエントリから受けるサポートの量に直接関係します。多くの場合、例外からキャプチャできるコンテキストがないと、より多くの検出作業を実行する必要があり、類似性を確認するためにエラーをグループ化することがより困難になります。

  • パッチシステム。更新をプッシュできる場合は、例外処理の実行を待つ自由がたくさんあります。ロジックがWebアプリでクライアントが単なるブラウザーの場合も同様です。

  • あなたのチームのサイズ。あなたが一人のチームであるならば、あなたは待つために途方もない自由を持っています。あなたはあなたのコードを知っています。例外がtodoリストにあることを事前に知っているかもしれません。作業して他の開発者とコードを共有する場合、他の誰かのコードを追跡するためのチケットが割り当てられる可能性があるため、例外がどこにトリップしたのかすぐにはわかりません。

  • 並行性。私にとって、これは計画するのが難しいので、努力する価値はないかもしれません。また、これは堅牢性または弾力性の一部だと感じています。したがって、要件が突然のクラッシュを許容する場合は、大きな自由があるため、例外に対処するまで待機します。スレッドで見つかる可能性があることの1つは、非決定的な動作を簡単に取得できることです。これが発生した場合、障害に至るまでの状態に関する情報をできるだけ多く取り込む方法が必要です。これには、マシンのラボでのシミュレーション、回帰テスト、ログ、(ライブ)データを含めることができます。個別にこれらの各部分は、他の部分をある程度相殺できます。たとえば、無限のテストがある場合、すべてのロジック障害を公開できるため、例外処理(またはロギングなど)は必要ありません。


2

例外処理は、ゲームの任意の時点からの予期しないエラーを処理するためのより明確な方法です。しかし、その美しさは、コードベースでは、コードをどれだけ深く処理しても問題になりません。例外なく、ある種のエラー処理ルーチンは、ある種のステータスに対してboolまたはintを返し、次にネストされたサブルーチンを展開して、最上位の領域(ゲームクラス)に到達し、そこから終了します。例外を使用するのであれば、リファクタリングをほとんどまたはまったく必要としないので、可能な限りあらゆる点からエラーチェックにコードを書き込むのは非常に面倒になります。

あなたの質問はXNA固有なので、Xboxゲームで例外を処理する方法を知ることはおそらく役に立ちます。そこでゲームが例外をキャッチしない場合、それが発生した理由についての手掛かりが残されないためです。この記事では、try / catchブロックでゲーム全体を実行することで問題を回避するための賢い方法を示します。何か問題が発生した場合、新しい「ExceptionGame」を起動し、ExceptionGameに表示するエラーの詳細を渡します。


2

C#については何も知りませんが、ここでは3セントです。

  1. try / catch / finally例外処理パラダイムは広く普及しており、それには十分な理由があります。コード内の例外を処理するための優れたフレームワークを提供します。
  2. 特定の言語を使用している場合は、そのすべてのステートメントとその使用方法を学習する必要があります。そうしないと、コードがわかりにくく、バグが多く、非効率的なものになります。プログラミング言語の設計には多くの考慮が払われており、利用可能なすべてのツールを使用せずにプログラムを作成しようとするのは... ばかげています。
  3. 侮辱的ではありませんが、ゲーム開発には多くの挑戦的な側面があり、「私が絶対に必要なものを学ぶだけだ」という態度でそれをしようとすることはうまくいきません。ゲームを開発するという目標への道のりを、できるだけ多くのことを学ぶ機会として利用するほうがよいでしょう。

1

いいえ、例外は絶対に重要でも必須でもありません。ほとんどの場合、従来のゲームプログラムはエラーチェックに非常に負荷がかかり、データとパラメータで何が起こっているかを正確に把握しています。

これに対する例外は、システムコールにアクセスする場合であり、それらは例外をスローし、それらをキャッチする方法は非常によく文書化されており、自分で例外をより深く使い始めるまで、ブラックボックスのようにtry / catchを使用できます。

全体のtry / catchの事はあるピックアップし、あなたがC#に慣れたら、あなたは例外が理にかなって、あなたが自然に独自のコードにそれらを追加するために始めることができる場所を確認することができます非常に簡単しかし。

もちろん、あなたはまだ始まったばかりだと仮定します。他の言語の後にC#を学習している場合は、例外を取り上げて、後で待つ必要があります。


3
いいえ、例外は非常に重要な意味で重要です。try-catch-throwを理解して使用すると、デバッグ時間を簡単に10倍に短縮できます。
Nevermind '28

1
c ++ではなくc#について話している場合、例外はオプションになる可能性があります。
Jari Komppa、2011

1
私は同意しなければなりません。確かなゲームプログラムは例外のずっと前から存在し、今日に至るまでそれらなしで存在し続けました。複雑なゲームは、小さなおもちゃのタイトルだけでなく、主要なパブリッシャーによって48時間の連続稼働時間を吟味されています。例外がゲームを実行するロジックの不可欠な部分であると主張している場合、例外を誤用している、またはアサートを忘れているのではないかと思います。これは確かに重要なデバッグツールです。
Patrick Hughes

1
@Patrick Hughesベースのx86アセンブラ以外は何も使用せずに「ソリッドゲームプログラム」を作成できます。それはあなたがすべきだという意味ではありません。C#について話している場合、例外は言語の不可欠で非常に重要な部分です。(アサーション、OTOHは言語の一部ではありませんが、それらの有用性については異論はありません)
Nevermind

2
私はこれらのフォーラムの集合的な知恵に頭を下げます!私は自分の回答を編集しませんが、その代わりに、それを行わないようにするためのリマインダーとして残し、C#に深く潜り込んだ場合は上記のベストアンサーに従ってください=)
Patrick Hughes

1

それはあなたのゲームコードの性質に依存すると私は信じています。実行の流れの中で、失敗する可能性のある領域はありますか?コードは100%処理されていますか?コードに失敗する方法がなく、事後条件とそれに確実に気づいている場合、例外処理はほとんど役に立ちません。理由もなくチェックするためにリソースの使用を増やします。ただし、コードの大部分には、問題が発生する可能性がある状況があります。特にゲーム開発において、ゲームが予測可能である場合、それはゲームであるという本質を欠いている可能性があります。ゲーム開発での使用に関係なく、それとその使用方法を知っておく必要があります。ただし、必要に応じて適用してください。


1

ブレークポイントを挿入したり、コード全体を調べたりせずに、urプログラムで何が問題だったかを知りたいですか?はいの場合、try-catchステートメントはそれを行うのに役立ちます。これは、事前設定されたタイプのエラーを使用して何が問題になったかを示します。したがって、これらのステートメントを実際に学習し、どのエラーが何を意味するかを知ることにより、手間をかけずにコードを効果的にデバッグできます。


0

上手、

通常、オブジェクト指向ソフトウェアは、実行中のプロセスのエラーを報告するために例外を使用する傾向があります。現在のメソッドが対処/解決できないことが発生した場合は、例外をスローし、上級者がこの問題を処理できるようにする必要があります。このようにすると、主な処理方法(より具体的な方法)は、解決できないエラーを処理する必要がなく、よりクリーンになります。

ただし、通常、ゲーム開発では、穴の環境を設計しているため、例外はスローされません。エンジンを設計している場合、はい、基本的にI / O機能の例外を使用しますが、たとえば、シーンでは、それを使用することはほとんどありません。エラーをスローするのではなく、解決する必要のある事柄のリストに追加する方がよいことがわかりました。たとえば、クライアント/サーバーゲームがあるとします。クライアントで、問題が発生していることに気付きました。シーケンスを壊すのではなく、解決する必要があるエラーのリストにこのエラーを追加する方が(私にとって)良いと私は思います。そうすれば、このエラーをジャンプして例外をスローしないで、誰かがこの問題を修正しようとします。

ただし、使用するOOソフトウェアでは、例外が常に使用されることに注意してください。学ぶことは本当に良いことで、とても便利で、難しいことではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.