Menu
CoddyTech

Xử lý lỗi là gì?

Thuộc phần Logic và luồng chương trình trong hành trình GDScript của Coddy. Bài học 66 trên 78.

Chương trình có thể dừng giữa chừng do một lỗi. Đoạn code này yêu cầu lấy phần tử ở chỉ số 5 của một mảng chỉ có ba phần tử:

var inventory := ["sword", "shield", "potion"]
var slot := 5
print(inventory[slot])
print("Done")

Godot báo Out of bounds get index '5' và hàm dừng ở dòng đó, nên Done không bao giờ được in ra. Đây là lỗi khi chạy: code hợp lệ, nhưng một giá trị mà code nhận được khi chạy khiến một dòng không thể thực thi.

Các lỗi khi chạy bạn thường gặp nhất là:

  • chia một số nguyên cho không, như trong 10 / count khi count là 0 (tương tự với %)
  • đọc một khóa không tồn tại bằng dấu ngoặc vuông, như trong player["mana"]
  • chỉ số nằm ngoài mảng, như trong inventory[5] ở trên

Python và Java có thể bắt lỗi sau khi lỗi xảy ra bằng try và except hoặc catch. GDScript không có ngoại lệ và không có try. Xử lý lỗi trong GDScript nghĩa là kiểm tra giá trị trước dòng lệnh có thể gây lỗi và quyết định xem nên làm gì thay thế:

if slot >= 0 and slot < inventory.size():
	print(inventory[slot])
else:
	print("Slot ", slot, " is empty")

Phép kiểm tra cần cả hai phần. Chỉ số âm như -1 không phải là lỗi: nó đọc từ cuối mảng, không đúng với ý nghĩa của số vị trí.

Khi lỗi xảy ra bên trong hàm bạn gọi, hàm đó sẽ dừng và trả về một giá trị rỗng, chẳng hạn như 0 hoặc null, rồi hàm gọi tiếp tục chạy với giá trị sai đó. Một số lỗi khiến chương trình nhận giá trị sai mà không báo lỗi: int("abc") cho kết quả 0.

challenge icon

Thử thách

Dễ

Mảng inventory có bốn ô, được đánh số bắt đầu từ 0. Chương trình đọc một dòng đầu vào: số ô (một số nguyên, có thể âm).

Nếu ô đó tồn tại, hãy in ra Slot , số ô, : và vật phẩm. Với đầu vào 2, đầu ra là:

Slot 2: potion

Nếu không, hãy in ra Slot , số ô và is empty. Với đầu vào 7, đầu ra là:

Slot 7 is empty

Số âm không bao giờ là số ô hợp lệ: với -1, hãy in ra Slot -1 is empty. Chương trình không được dừng do lỗi.

Tự làm thử

extends Node

func _ready():
	var inventory := ["sword", "shield", "potion", "bow"]
	var slot := int(OS.read_string_from_stdin())

	# In ra vật phẩm ở ô đó, hoặc thông báo rằng ô đó trống
	pass
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch GDScript online