Komunitas bahasa pemrograman Rust sedang terlibat dalam diskusi sengit tentang pendekatan penanganan error, yang dipicu oleh analisis mendalam tim iroh tentang perjalanan mereka dari error handling generik ke terstruktur. Perdebatan ini menyoroti ketegangan fundamental antara produktivitas developer dan presisi API yang mempengaruhi setiap proyek Rust.
Perpecahan Besar: Anyhow vs Thiserror
Ekosistem Rust sebagian besar telah terbagi menjadi dua kubu untuk penanganan error. Pendekatan anyhow
memperlakukan error sebagai satu tipe generik besar yang dapat membungkus apa pun, membuatnya cepat untuk diimplementasikan dan sangat baik untuk debugging dengan backtrace lengkap. Di sisi lain, thiserror
menciptakan varian enum yang dibuat dengan hati-hati untuk setiap kasus error yang mungkin terjadi, memberikan konsumen tipe error yang presisi yang dapat mereka cocokkan dan tangani secara berbeda.
Anggota komunitas mempertanyakan apakah kompleksitas ini sepadan. Beberapa developer mengungkapkan nostalgia untuk pendekatan yang lebih sederhana, dengan satu orang mencatat bahwa mereka lebih memilih error handling Go yang lugas daripada sistem Rust yang rumit. Namun, yang lain berargumen bahwa kompleksitas tersebut memiliki tujuan - dalam bahasa dengan exception, menentukan bagaimana suatu fungsi dapat gagal memerlukan kepercayaan pada dokumentasi atau membaca seluruh rantai pemanggilan.
Perbandingan Pendekatan Penanganan Error
Pendekatan | Kelebihan | Kekurangan | Terbaik Untuk |
---|---|---|---|
anyhow | Implementasi cepat, backtrace lengkap, konteks mudah | Error generik, API kurang presisi | Aplikasi, pembuatan prototipe cepat |
thiserror | Tipe error presisi, API stabil, varian dapat dicocokkan | Lebih banyak boilerplate, keterbatasan backtrace | Library, API publik |
snafu | Error berbasis enum + backtrace, konteks kaya | Kompleksitas tambahan, kurva pembelajaran | Kebutuhan hybrid library/aplikasi |
Masalah Backtrace yang Tidak Kunjung Hilang
Sumber frustrasi utama berasal dari propagasi backtrace Rust yang belum distabilkan pada error. Keterbatasan teknis ini memaksa developer untuk memilih antara ergonomis yang baik dengan operator ?
atau backtrace yang tepat. Masalah ini muncul dari sistem trait Rust - mengimplementasikan std::error::Error
menciptakan konflik antara implementasi blanket yang diperlukan untuk ergonomis dan penanganan backtrace yang memerlukan tipe konkret.
Keterbatasan fundamental ini berarti penulis library harus membuat pilihan sulit tanpa solusi sempurna. Tim iroh menemukan jawaban mereka dalam snafu
, yang mereka gambarkan sebagai thiserror dengan steroid, menyediakan tipe error berbasis enum dengan lampiran konteks yang kaya dan penangkapan backtrace otomatis.
Penolakan Komunitas terhadap Kompleksitas
Diskusi mengungkapkan kekhawatiran yang berkembang tentang kompleksitas error handling Rust. Beberapa anggota komunitas berargumen bahwa ekosistem telah memperumit apa yang seharusnya menjadi manajemen error yang lugas. Mereka menunjukkan bahwa bahasa sukses seperti Python dan Java menangani exception dengan anggun dalam proyek dunia nyata, mempertanyakan apakah pendekatan Rust benar-benar memberikan manfaat yang proporsional.
Setiap fungsi dapat gagal dengan StackOverflowError dan Anda tidak dapat berbuat apa-apa tentang itu. Hampir setiap fungsi dapat gagal dengan OutOfMemoryError dan Anda tidak dapat berbuat apa-apa tentang itu. Saya telah menerima bahwa segala sesuatu dapat gagal.
Yang lain membela structured error sebagai hal yang penting untuk API library, berargumen bahwa pemodelan error yang tepat mengurangi kegagalan yang dihadapi pengguna dengan mengorbankan waktu developer. Perdebatan menyentuh apakah industri telah mengabaikan error handling tanpa exception, dengan developer Rust menjadi yang pertama menangani masalah ini secara serius.
Kesenjangan Dokumentasi dan Best Practice
Keluhan berulang dalam diskusi komunitas berpusat pada dokumentasi best practice Rust yang tersebar. Tidak seperti bahasa dengan panduan gaya terpusat, developer Rust harus mencari melalui posting blog dan diskusi komunitas untuk menemukan rekomendasi error handling terkini. Fragmentasi ini membuat sulit bagi developer yang kembali ke Rust untuk mengetahui pendekatan dan pola terbaru.
Panduan terperinci tim iroh untuk penulisan error konkret - seperti membatasi enum error pada fungsi daripada modul dan menyertakan varian kustom untuk trait publik - mewakili jenis kebijaksanaan praktis yang diharapkan developer lebih terdokumentasi secara terpusat.
Panduan Penanganan Error Rust dari Tim iroh
- Batasi cakupan enum error pada fungsi, bukan modul - Membuat kategori error lebih mudah dipahami
- Gunakan nama error yang deskriptif -
TicketParseError
vsTicketError
memperjelas cakupan kegagalan - Sertakan varian Custom untuk trait publik - Memungkinkan implementer untuk menyebarkan error mereka sendiri
- Sediakan metode helper -
custom_err()
dancustom_err_box()
untuk pembuatan error yang mudah
Melihat ke Depan: Pragmatisme atas Dogma
Diskusi komunitas menunjukkan pengakuan yang berkembang bahwa proyek yang berbeda memiliki kebutuhan error handling yang berbeda. Meskipun ada tekanan untuk memastikan semua library mengembalikan error konkret, kenyataan pragmatis adalah bahwa tim harus menyeimbangkan berbagai pertimbangan termasuk kecepatan pengembangan, stabilitas API, dan kemampuan debugging.
Pendekatan hibrida tim iroh - menggunakan structured error untuk API publik sambil mempertahankan konteks yang kaya dan backtrace - mungkin mewakili jalan tengah yang praktis. Namun, keterbatasan fundamental dalam cerita error handling Rust berarti bahwa sampai propagasi backtrace distabilkan, tim akan terus membuat tradeoff daripada menemukan solusi sempurna.
Referensi: Trying to get error backtraces in rust libraries right