Чтение документации API: ошибки и право собственности
Понимание единиц аргументов, структур результатов, частичного успеха и времени жизни ресурсов.
Wave Foundation
Прочтите декларацию
Следующее обозначение описывает объявление функции и не представляет собой весь исполняемый файл.
io_read(fd: i64, buf: ptr<u8>, len: i64) -> i64
fd — открытый дескриптор, buf — объем памяти, предоставляемый вызывающей стороной, и len — количество байтов, доступных для записи. i64 не означает, что допустимы отрицательные длины. Возвращаемое значение — это фактическое количество прочитанных байтов, а не длина запроса, поэтому используется только возвращаемый диапазон.
Выражение отказа варьируется от функции к функции
| путь | да | Метод проверки |
|---|---|---|
| Указатель или null | mem_alloc |
null Доступ к памяти после проверки |
| количество байтов или отрицательное число | io_read |
Отрицательная ошибка, 0 EOF, положительные данные |
| код состояния | buffer_push |
Константа ошибки сравнения с BUFFER_OK |
| Успех и ценность | NetResult<T> |
После изучения ok используйте value. |
| Частичный прогресс включен | RandomFillResult |
Проверьте ok, written, error вместе. |
Он смотрит только на количество ошибок и не сравнивает их с константами в других модулях. Например, номера ошибок env и OS errno не относятся к одной и той же системе. Исходную ошибку в WASI не следует интерпретировать как Linux errno.
владение и аренда
- Owned: Когда получена выделенная память, открытый файл или открытый сокет, он отвечает за вызов соответствующего освобождения/закрытия.
- Borrow: Байт view или буфер, передаваемый функции, относится к существующей памяти. Если функция не указывает, что она получает право собственности, вызывающая сторона сохраняет контроль.
- Выходной аргумент: передает допустимое пространство памяти, где результат может быть записан в функцию, которая его получает, например
out_value: ptr<T>. Убедитесь, что в контракте указано, что результат действителен только в случае успеха.
Копирование структуры Buffer может привести к тому, что обе копии будут указывать на одно и то же распределение. Не освобождайте каждую копию отдельно. Заимствованный указатель становится недействительным после освобождения или перераспределения выделения. Строковые литералы не являются записываемыми буферами.
Неудача не означает возврат к предыдущему состоянию.
io_write_all может выйти из строя после записи нескольких байтов. Байты, уже записанные извне, не будут возвращены. С другой стороны, чтение checked cursor из bytes сохраняет положение и выходное значение в случае сбоя. Эти различия указаны в API.
Если вы также хотите попрактиковаться в устранении сбоев, перейдите к Программа чтения файлов и Двоичное сообщение.