Menu
CoddyTech

エラー処理とは?

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です。

challenge icon

チャレンジ

簡単

配列 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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: GDScriptオンラインコンパイラ