エラー処理とは?
CoddyのGDScriptジャーニー「ロジックとフロー」セクションの一部。レッスン 66/78。
プログラムはエラーが原因で途中で停止することがあります。このコードは、要素が3つしかない配列の5番目のスロットを要求しています。
var inventory := ["sword", "shield", "potion"]
var slot := 5
print(inventory[slot])
print("Done")Godot は Out of bounds get index '5' と報告し、その行で関数が停止するため、Done は出力されません。これは実行時エラーです。コード自体は有効ですが、実行中に取得した値によって、ある行を実行できなくなっています。
よく発生する実行時エラーは次のとおりです:
countが0のときの10 / countのように、整数をゼロで割ること(%も同様)player["mana"]のように、角括弧を使って存在しないキーを読み取ること- 上記の
inventory[5]のように、配列の範囲外のインデックスを指定すること
PythonやJavaでは、tryとexceptまたはcatchを使って、エラーが発生した後にエラーを捕捉できます。GDScriptには例外もtryもありません。GDScriptでのエラー処理とは、失敗する可能性のある行の前に値を確認し、代わりに何をするかを決めることです。
if slot >= 0 and slot < inventory.size():
print(inventory[slot])
else:
print("Slot ", slot, " is empty")チェックには両方の部分が必要です。-1のような負のインデックスはエラーではありません。配列の末尾から読み取るため、スロット番号の意味とは異なります。
呼び出した関数の内部でエラーが発生すると、その関数は停止して、0やnullなどの空の値を返し、呼び出し元はその誤った値のまま処理を続けます。エラーが発生せずに誤った値が返される間違いもあります。int("abc")は0です。
チャレンジ
簡単配列 inventory には4つのスロットがあり、番号は 0 から始まります。プログラムは1行の入力を読み取ります。入力はスロット番号(負の数の場合もある整数)です。
スロットが存在する場合は、Slot 、番号、: 、アイテムを出力します。入力が 2 の場合、出力は次のとおりです。
Slot 2: potionそれ以外の場合は、Slot 、番号、 is empty を出力します。入力が 7 の場合、出力は次のとおりです。
Slot 7 is empty負の数がスロットになることはありません。-1 の場合は、Slot -1 is empty を出力します。プログラムがエラーで停止してはいけません。
自分で試してみよう
extends Node
func _ready():
var inventory := ["sword", "shield", "potion", "bow"]
var slot := int(OS.read_string_from_stdin())
# スロットにあるアイテム、またはスロットが空であることを出力する
pass
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ