Предскажите вывод числовых операций и поиска, затем исправьте обращение к массиву, останавливающее выполнение. Примеры показывают поведение программы после успешной проверки.
Установите Топаз по инструкции «Первая программа». Сохраните два примера в отдельных файлах и запускайте каждый из его каталога.
Наблюдаем обычные значения
Сохраните код в runtime-behavior.tpz.
let значения = [10, 20]
print("int: {7 / 2} {-7 % 3}")
print("float: {1.5 + 1.5}")
print("safe: {значения.get(9)}")Выполните topaz run runtime-behavior.tpz.
int: 3 -1
float: 3.0
safe: None7 / 2 даёт 3, поскольку целочисленное деление отбрасывает дробную часть в направлении нуля. -7 % 3 даёт -1, поскольку остаток получает знак делимого. 1.5 + 1.5 выводится как 3.0.
значения.get(9) возвращает None, потому что в массиве нет элемента с индексом 9. get представляет отсутствие как значение, поэтому программа продолжает работу.
print принимает строку и добавляет перевод строки. Перед вызовом интерполяция преобразует числа и Option в текст. Для вывода строки используйте print. Свободной функции println нет.
Наблюдаем неверный индекс массива
Сохраните второй пример в intentional-fault.tpz.
let задачи = ["Run first program", "Build application"]
print(задачи[2])Выполните topaz run intentional-fault.tpz. Команда завершится с ненулевым статусом и укажет место неверного обращения.
error[TPZ4001]: index 2 is out of bounds for an array of length 2
--> intentional-fault.tpz:2:7
|
2 | print(задачи[2])
| ^^^^^^^^^
В массиве два элемента с индексами 0 и 1. Замените задачи[2] на задачи[1] и запустите программу снова, чтобы вывести Build application. Если отсутствие индекса допустимо, используйте задачи.get(2) и обработайте None.
Ошибка выполнения, или fault, останавливает программу. Её нельзя перехватить постфиксным ?, операторами необязательных значений или concurrent. Значения None и Err программа может обработать.
Различаем результаты неудачи
| Ситуация | Результат |
|---|---|
| Значение отсутствует | Option, например None от get |
| Операция возвращает причину ошибки | Result со значением Ok или Err |
| Выполнение достигает недопустимой операции | Ошибка выполнения и ненулевой статус процесса |
| Исходный код неверен до запуска | Диагностика от topaz check |
int представляет знаковое 64-разрядное целое число. Переполнение останавливает программу с ошибкой выполнения. float использует арифметику IEEE-754 binary64, поэтому десятичные дроби могут требовать округления.
Следующие условия вызывают ошибку при достижении операции во время выполнения.
| Операция | Недопустимое условие |
|---|---|
| Прямое индексирование массива | Индекс вне массива |
| Целочисленное деление или остаток | Делитель равен нулю |
| Целочисленная арифметика | Результат выходит за диапазон целого |
| Перебор диапазона | Шаг равен нулю |
| Целочисленное возведение в степень | Показатель отрицательный |
match | Ни одна ветка не соответствует значению |
Проверка может отклонить неверную константную арифметику до запуска. Для значений, вычисляемых во время выполнения, проверяйте вход перед операцией.
Глубина вызовов ограничена 1000 кадрами на всех путях выполнения. Это означает 1000 активных вложенных вызовов. Более глубокий вызов сообщает TPZ5009 в месте вызова. Параметра командной строки для увеличения предела нет.
Что остаётся устойчивым
Строки сравниваются как точные последовательности скаляров Unicode. Скаляр соответствует одной кодовой точке Unicode вне диапазона суррогатов. Топаз не нормализует разные последовательности автоматически к одному написанию. Например, готовый символ "é" и "é" не равны, хотя могут выглядеть одинаково.
Массивы сохраняют порядок элементов. Снимки ключей Map сохраняют порядок вставки. Другие операции коллекций и функции обратного вызова следуют порядку, установленному для каждой операции.
При выводе значений record, enum и newtype сохраняется имя конструктора типа. Формы вывода включают Name { field: value }, Name.Variant и Name(value). Целевые платформы могут хранить значения по-разному, сохраняя правила языка для вывода и выполнения.
Обработка значений описана в разделе Null, Option, Result и ошибки, тайм-ауты в разделе «Конкурентность», функции преобразования в базовой библиотеке. Строки и шаблоны объясняют позиции скаляров.