Menu
CoddyTech

Что такое обработка ошибок?

Часть раздела Логика и потоки выполнения путешествия по GDScript на Coddy. Урок 66 из 78.

Программа может остановиться на полпути из-за ошибки. Этот код обращается к ячейке 5 массива, в котором всего три элемента:

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

Godot сообщает Out of bounds get index '5', и функция останавливается на этой строке, поэтому Done так и не выводится. Это ошибка времени выполнения: код корректен, но полученное во время выполнения значение делает невозможным выполнение одной из строк.

Ошибки времени выполнения, с которыми вы сталкиваетесь чаще всего:

  • деление целого числа на ноль, например 10 / count, когда count равно 0 (то же самое относится к %)
  • чтение отсутствующего ключа с помощью квадратных скобок, например 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 четыре слота, пронумерованных начиная с 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