Что такое обработка ошибок?
Часть раздела Логика и потоки выполнения путешествия по 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.
Задание
ЛегкоВ массиве 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки: углублённое изучение
Методы строкПоиск в строкахЗамена и обрезка пробеловРазделение и объединениеПовторение — проверка имени пользователя4Словари. Часть 2
Вложенные словариМассивы словарейОбъединение словарейКопирование словарейПовторение — подсчёт частоты10Продвинутые функции
Возврат нескольких значенийЛямбда-функции. Часть 1Лямбда-функции. Часть 2Повторение — сортировка с помощью лямбда-функцииРекурсивные функции. Часть 1Рекурсивные функции. Часть 2Повторение — сумма вложенного массива13Система управления запасами
Обзор проектаДобавление товара2Продвинутое управление ветвлением
Сопоставление с переменнымиУсловия в шаблонахШаблоны массивовШаблоны словарейПроверка принадлежностиИтоги — парсер команд5Приложение «Телефонная книга»
Показать менюДобавить контакт8Менеджер успеваемости студентов
Обзор проектаДобавить студента3Многомерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваВложенные циклы с двумерными массивамиПовторение: двумерные массивыРваные массивыТипичные шаблоны работы с двумерными массивамиПовторение: игровое поле6Множества и словари
Что такое множество?Словарь как множествоДобавление и удалениеОбъединение и пересечениеРазность множествПовторение — удаление дубликатов9Расширенная агрегация данных
Суммирование значенийПоиск минимального и максимального значенийПользовательская сортировкаПовторение — сортировщик словарей12Основы обработки ошибок
Что такое обработка ошибок?Проверка входных данныхЗащитные условияВозврат кодов ошибокПовторение — безопасное делениеПотренируйтесь самостоятельно: Онлайн-компилятор GDScript