Membaca dokumentasi API: Kesalahan dan kepemilikan

Pahami unit argumen, struktur hasil, keberhasilan parsial, dan masa pakai sumber daya.

Wave Foundation

Baca deklarasinya

Notasi berikut menjelaskan deklarasi fungsi dan bukan keseluruhan file yang dapat dieksekusi.

io_read(fd: i64, buf: ptr<u8>, len: i64) -> i64

fd adalah deskriptor terbuka, buf adalah penyimpanan yang disediakan oleh pemanggil, dan len adalah jumlah byte yang tersedia untuk penulisan. i64 tidak berarti panjang negatif itu valid. Nilai yang dikembalikan adalah jumlah byte sebenarnya yang dibaca, bukan panjang permintaan, jadi hanya rentang yang dikembalikan yang digunakan.

Ekspresi kegagalan bervariasi dari satu fungsi ke fungsi lainnya

cara ya Metode inspeksi
Penunjuk atau null mem_alloc null Akses memori setelah pemeriksaan
jumlah byte atau angka negatif io_read Kesalahan negatif, 0 EOF, data positif
kode status buffer_push Perbandingan konstan kesalahan dengan BUFFER_OK
Sukses dan bernilai NetResult<T> Setelah memeriksa ok, gunakan value
Termasuk kemajuan parsial RandomFillResult Centang ok, written, error bersama-sama.

Itu hanya melihat jumlah kesalahan dan tidak membandingkannya dengan konstanta di modul lain. Misalnya, nomor kesalahan env dan OS errno bukanlah sistem yang sama. Kesalahan asli di WASI tidak boleh ditafsirkan sebagai Linux errno.

memiliki dan menyewakan

  • Milik: Ketika memori yang dialokasikan, file terbuka, atau soket terbuka diperoleh, ia bertanggung jawab untuk memanggil rilis/penutupan yang sesuai.
  • Pinjam: Byte view atau buffer yang diteruskan ke fungsi mengacu pada memori yang ada. Jika suatu fungsi tidak menentukan bahwa ia menerima kepemilikan, pemanggil tetap memegang kendali.
  • Argumen keluaran: Melewati ruang penyimpanan yang valid di mana hasilnya dapat ditulis ke fungsi yang menerimanya, seperti out_value: ptr<T>. Pastikan kontrak menyatakan bahwa hasilnya hanya valid jika berhasil.

Menyalin struktur Buffer dapat membuat kedua salinan mengarah ke alokasi yang sama. Jangan gratiskan setiap salinan secara terpisah. Pointer yang dipinjam menjadi tidak valid setelah alokasi dibebaskan atau dialokasikan kembali. Literal string bukanlah buffer yang dapat ditulis.

Kegagalan bukan berarti kembali ke keadaan sebelumnya

io_write_all mungkin gagal setelah menulis beberapa byte. Byte yang sudah ditulis secara eksternal tidak akan dikembalikan. Di sisi lain, pembacaan checked cursor dari bytes mempertahankan posisi dan nilai keluaran jika gagal. Perbedaan ini ditentukan oleh API.

Jika Anda juga ingin berlatih menangani kegagalan, lanjutkan dengan Pembaca file dan Pesan biner.