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 开始。程序读取一行输入:一个槽位编号(整数,可以是负数)。

如果该槽位存在,则输出 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 在线编译器