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 / countkhicountlà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.
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: potionNếu không, hãy in ra Slot , số ô và is empty. Với đầu vào 7, đầu ra là:
Slot 7 is emptySố â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
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
1Chuyên sâu về chuỗi
Các phương thức của chuỗiTìm kiếm trong chuỗiThay thế và xóa khoảng trắngTách và nốiÔn tập: Kiểm tra tên người dùng7Kiểu liệt kê
Kiểu liệt kê là gì?Định nghĩa kiểu liệt kêCác giá trị của kiểu liệt kêKiểu liệt kê trong matchÔn tập: đèn giao thông10Hàm nâng cao
Trả về nhiều giá trịHàm lambda phần 1Hàm lambda phần 2Ôn tập: sắp xếp bằng lambdaHàm đệ quy phần 1Hàm đệ quy phần 2Ôn tập: tính tổng mảng lồng nhau13Hệ thống quản lý hàng tồn kho
Tổng quan dự ánThêm mặt hàng2Ra quyết định nâng cao
So khớp với biếnĐiều kiện bảo vệ trong so khớpMẫu mảngMẫu từ điểnKiểm tra thành viênÔn tập: Bộ phân tích lệnh5Ứng dụng sổ liên lạc
Hiển thị menuThêm liên hệ8Trình quản lý hồ sơ học sinh
Tổng quan dự ánThêm học sinh3Mảng nhiều chiều
Cơ bản về mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuVòng lặp lồng nhau với mảng 2 chiềuÔn tập: mảng 2 chiềuMảng răng cưaCác mẫu phổ biến với mảng 2 chiềuÔn tập: bàn cờ6Tập hợp với từ điển
Tập hợp là gì?Từ điển như một tập hợpThêm và xóaHợp và giaoHiệu tập hợpÔn tập: Xóa phần tử trùng lặp9Tổng hợp dữ liệu nâng cao
Tính tổng các giá trịTìm giá trị nhỏ nhất và lớn nhấtSắp xếp tùy chỉnhÔn tập: Sắp xếp từ điển12Xử lý lỗi cơ bản
Xử lý lỗi là gì?Xác thực đầu vàoMệnh đề bảo vệTrả về mã lỗiÔn tập: phép chia an toànTự luyện tập: Trình biên dịch GDScript online