I.3. Исключительные ситуации или ошибки времени выполнения - madwareru/drafting-interpreters GitHub Wiki
Мы будем реализовывать вариант калькулятора обратной польской записи, у которого для простоты подачи материала выбрано всего четыре команды:
- Операция укладывания на стек вещественного числа
- Бинарная операция сложения
- Бинарная операция деления
- Унарная операция взятия квадратного корня
Но просто выполнить подряд предоставленные операции будет вряд ли возможно.
Как говорил Л.Н. Толстой,
гладко было на бумаге, да забыли про овраги"
Так какие овраги проблемные ситуации могут возникнуть во время выполнения?
- На стеке может не оказаться достаточного количества операндов (бинарные операции требуют наличия хотя бы двух, унарные — хотя бы одного операнда)
- В случае деления мы можем попытаться поделить на ноль
- В случае квадратного корня мы можем попытаться взять его от отрицательного числа
- В случае если вообще никаких операций не выполнялось стек будет пуст, и результат вычислений соответственно тоже неоткуда будет взять
При возникновении любой подобной ситуации интерпретатор обязан прекратить свою работу и просигнализировать пользователю об ошибке. Это называется ошибкой времени выполнения или исключительной ситуацией. Путей решения может быть как всегда несколько:
- Мы можем написать наш интерпретатор в виде функции, которая последовательно считывает операции, проверяет условия их выполнимости, и если они не выполняются, выбрасывается исключение соответствующего типа. В противном случае она продолжает выполнять операции и в конце выводит результат операций
- Интерпретатор вызывает у каждой операции её собственный метод для вычисления. Каждая операция возвращает результат своей работы, который является либо успешным, либо содержит ошибку. В случае ошибочного результата этот результат становится результатом выполнения всего выражения, иначе работа продолжается. Сам интерпретатор так же возвращает результат
Далее мы разберём оба этих варианта.