Godot: gdscriptのある種のtryfinally(またはexcept)ブロック

作成日 2016年01月30日  ·  13コメント  ·  ソース: godotengine/godot

Pythonではtryと呼ばれますが、Javaではtrycatchを最後に実行します。 失敗した場合は、tryブロック内のコードを実行し、代わりにfinallyブロックを実行します。 これにより、すべてのクラッシュが削除されるため、gdスクリプトでのコーディングが大幅に簡素化されます。 悪いコードについて心配する必要はもうありません。 動的なデータに対して1つのコードを機能させ、データが存在しない場合に備えて追加のフェイルセーフを構築する必要がない場合があります。

失敗したtryブロックからのすべてのエラーは、とにかくデバッグウィンドウに常に表示されるため(自動キャッチ)、心配する必要がなくても、コードが不良であることがわかります。

試す
...ここにコード
ついに
...ここにコード

archived feature proposal gdscript

最も参考になるコメント

@ salvob41この場合、これを使用できます:

if is_instance_valid(object):
    #Do what you want if the node exists

@Kotzuo 、実行フローが決定論的ではないため、これが常に機能するとは限りません。 process関数は危険です

あなたは絶対に100%正しいです......それは危険なパターンです

ただし、ネットワークコードを実行する場合は、茶色のズボンです。 接続ステータスコードの取得の間に接続が切断されることがあります。

GDScriptでは、この問題を抱えていない(または抱えているとは思わない)他の人々からのこの防御は少し疲れます....そして、おそらく他の人々が異なるパターンでコーディングしていることを示唆しています。 たぶんあなたは「正しい」コーディングをしていて、私のやり方は「間違っている」のかもしれません。それらのようにコーディングするように強制します。

try and catchステートメントを取得した場合、誰もそれを使用する必要はありません....私のような人々とこの男は、私たちが好きなようにコーディングするための機能としてそれを望んでいます

全てのコメント13件

うーん、私にとっては、悪いコードによる奇妙な振る舞いよりもプログラムのクラッシュを好みます。 服用しないでください
間違っています、例外が正しく行われている場合、私は例外が大好きです。

これは、新しい静的(「動的」機能と混合されている可能性がありますか?)タイプのスクリプトのv2.1に残しておく必要があると思います。

例外は発生しません。 Godotは、物事が機能し続けるように設計されています
状態に一貫性がない場合、同時にエラーを報告します

土では、2016年1月30日8:18で、RebelliousX [email protected]
書きました:

うーん、私にとっては、悪いことによる奇妙な振る舞いよりもプログラムのクラッシュを好む
コード。 服用しないでください
間違っています、例外が正しく行われている場合、私は例外が大好きです。

これは、静的に(と混合して)新しいv2.1に残しておく必要があると思います
「動的」機能は多分?)タイプされたスクリプト。


このメールに直接返信するか、GitHubで表示してください
https://github.com/godotengine/godot/issues/3516#issuecomment-177151923

それについて考えるアイデアです。 たとえば、フォルダ内に多数の画像があり、それらをすべてタイルセットとして開きたいが、画像がないと言って、何も起こらないようにします。 フォルダ内のnullを簡単にチェックできるように見えるかもしれませんが、コードは実際にはtryブロックで簡単です。そうでない場合は試してみてください。 ダックコードの全体的な概念は、さらに多くのダックコードです。

さらに、Pythonでさえ、私が提案しているのと同じことをすることを除いて、それを試してみるので、前代未聞ではありません

はい、これは長い間評価され、検討され、賛否両論がありました。
例外は追加されません

土では、2016年1月30日8:45で、trollworkout [email protected]
書きました:

それについて考えるアイデアです。 たとえば、画像がたくさんあるとしましょう。
それらをすべてタイルセットとして開きたいが、画像がないと言うフォルダ
何も起こらないはずです。 単にnullをチェックできるように見えるかもしれませんが
フォルダー内のコードは、tryブロックで実際に簡単になります。
かっこいいじゃない。 ダックコードの全体的な概念は、さらに多くのダックコードです。

さらに、Pythonでさえ、私が提案しているのと同じことをすることを除いて、それを試してみます。
前代未聞ではありません


このメールに直接返信するか、GitHubで表示してください
https://github.com/godotengine/godot/issues/3516#issuecomment-177155429

問題なし :)

ノードのインスタンスが有効であるかどうかをノードのプロセス機能で確認した後、「以前に解放されたインスタンスのインデックスが無効である」ために失敗することはありませんか?

エラーは決定論的ではなく、すぐにゲームがクラッシュする可能性があるため(特に、エクスポートされたゲームではまったく報告されないため、これは煩わしいことです)。 try、catchは、非常にクリーンでシンプルな方法でバグを解決します。

これはまだ会社ではありませんか?

@ salvob41この場合、これを使用できます:

if is_instance_valid(object):
    #Do what you want if the node exists

@ salvob41この場合、これを使用できます:

if is_instance_valid(object):
    #Do what you want if the node exists

@Kotzuo 、実行フローが決定論的ではないため、これが常に機能するとは限りません。 process関数は危険です

@ salvob41この場合、これを使用できます:

if is_instance_valid(object):
    #Do what you want if the node exists

@Kotzuo 、実行フローが決定論的ではないため、これが常に機能するとは限りません。 process関数は危険です

あなたは絶対に100%正しいです......それは危険なパターンです

ただし、ネットワークコードを実行する場合は、茶色のズボンです。 接続ステータスコードの取得の間に接続が切断されることがあります。

GDScriptでは、この問題を抱えていない(または抱えているとは思わない)他の人々からのこの防御は少し疲れます....そして、おそらく他の人々が異なるパターンでコーディングしていることを示唆しています。 たぶんあなたは「正しい」コーディングをしていて、私のやり方は「間違っている」のかもしれません。それらのようにコーディングするように強制します。

try and catchステートメントを取得した場合、誰もそれを使用する必要はありません....私のような人々とこの男は、私たちが好きなようにコーディングするための機能としてそれを望んでいます

それは難しい決断です。 しかし、godotはエラーをうまく処理できないので、すべてのnull /エラーリターンを、必要な方法でエラー処理をサポートする別の言語にラップすることを試みることができます。
Swiftは良い選択肢です:

Swiftでのエラー処理は、try、catch、throwキーワードを使用した、他の言語での例外処理に似ています。 Objective-Cを含む多くの言語での例外処理とは異なり、Swiftでのエラー処理には、コールスタックの巻き戻しが含まれていません。このプロセスは、計算コストが高くなる可能性があります。 そのため、throwステートメントのパフォーマンス特性はreturnステートメントのパフォーマンス特性に匹敵します。

Swiftを使用する方法があれば、問題はないはずです。 私はgodotの初心者ですが、別の言語を動的にリンクする方法があると聞きました...
ああ、別の良いニュース。 2020年にswiftはWindowsの公式サポートを追加します。
私はこのテーマに完全に精通していませんが、1000のifステートメントとオプションのロジックフローなしでエラー処理を取得する方法があるかもしれません。

はい、これは長い間評価され、検討され、賛否両論がありました。
例外は追加されません

土では、2016年1月30日8:45で、trollworkout [email protected]
書きました:

それについて考えるアイデアです。 たとえば、画像がたくさんあるとしましょう。
それらをすべてタイルセットとして開きたいが、画像がないと言うフォルダ
何も起こらないはずです。 単にnullをチェックできるように見えるかもしれませんが
フォルダー内のコードは、tryブロックで実際に簡単になります。
かっこいいじゃない。 ダックコードの全体的な概念は、さらに多くのダックコードです。
さらに、Pythonでさえ、私が提案しているのと同じことをすることを除いて、それを試してみます。
前代未聞ではありません

このメールに直接返信するか、GitHubで表示してください
#3516(コメント)

さて、このトピックが始まって(そして終わって)から4年が経ちました、そしてこの問題に直面している人々がまだいます(例えば私)。 != nullweakrefsis_instance_validを試しましたが、参照されたノードの状態が有効性チェックと参照のメソッドの呼び出しの間で変化するだけなので、..秒でこの問題を解決するだろう(何でも除くキャッチしてみてください

@reduzこれを
無効な型を割り当てたときにエディターがクラッシュしないように、jsonを処理したいと思います。
Godotは私が安定していると考えるものではなく、gdscriptが静的に入力されていないため、毎日クラッシュします

@ Shadowblitz16これについてはすでに詳細に説明されており、

このページは役に立ちましたか?
0 / 5 - 0 評価