Komuniti bahasa pengaturcaraan Rust sedang terlibat dalam perbincangan hangat mengenai pendekatan pengendalian ralat, yang dicetuskan oleh analisis terperinci pasukan iroh tentang perjalanan mereka daripada pengendalian ralat generik kepada berstruktur. Perdebatan ini menyerlahkan ketegangan asas antara produktiviti pembangun dan ketepatan API yang mempengaruhi setiap projek Rust.
Perpecahan Besar: Anyhow vs Thiserror
Ekosistem Rust sebahagian besarnya telah menetap kepada dua kem untuk pengendalian ralat. Pendekatan anyhow
menganggap ralat sebagai satu jenis generik besar yang boleh membungkus apa sahaja, menjadikannya pantas untuk dilaksanakan dan sangat baik untuk nyahpepijat dengan jejak balik penuh. Di sisi lain, thiserror
mencipta varian enum yang dibuat dengan teliti untuk setiap kes ralat yang mungkin, memberikan pengguna jenis ralat yang tepat yang boleh mereka padankan dan kendalikan secara berbeza.
Ahli komuniti mempersoalkan sama ada kerumitan ini berbaloi. Sesetengah pembangun menyatakan nostalgia untuk pendekatan yang lebih mudah, dengan seorang menyatakan mereka lebih suka pengendalian ralat Go yang mudah berbanding sistem Rust yang rumit. Walau bagaimanapun, yang lain berhujah bahawa kerumitan itu mempunyai tujuan - dalam bahasa dengan pengecualian, menentukan bagaimana fungsi boleh gagal memerlukan sama ada mempercayai dokumentasi atau membaca melalui keseluruhan rantai panggilan.
Perbandingan Pendekatan Pengendalian Ralat
Pendekatan | Kebaikan | Keburukan | Terbaik Untuk |
---|---|---|---|
anyhow |
Pelaksanaan pantas, jejak balik penuh, konteks mudah | Ralat generik, API kurang tepat | Aplikasi, prototaip pantas |
thiserror |
Jenis ralat tepat, API stabil, varian boleh dipadankan | Lebih banyak kod boilerplate, had jejak balik | Pustaka, API awam |
snafu |
Ralat berasaskan enum + jejak balik, konteks kaya | Kerumitan tambahan, keluk pembelajaran | Keperluan hibrid pustaka/aplikasi |
Masalah Backtrace Yang Tidak Akan Hilang
Sumber utama kekecewaan berpunca daripada penyebaran backtrace Rust yang tidak stabil pada ralat. Batasan teknikal ini memaksa pembangun memilih antara ergonomik yang baik dengan operator ?
atau backtrace yang betul. Isu ini timbul daripada sistem trait Rust - melaksanakan std::error::Error
mencipta konflik antara pelaksanaan menyeluruh yang diperlukan untuk ergonomik dan pengendalian backtrace yang memerlukan jenis konkrit.
Batasan asas ini bermakna pengarang perpustakaan mesti membuat pilihan sukar tanpa penyelesaian yang sempurna. Pasukan iroh menemui jawapan mereka dalam snafu
, yang mereka gambarkan sebagai thiserror dengan steroid, menyediakan jenis ralat berasaskan enum dengan lampiran konteks yang kaya dan tangkapan backtrace automatik.
Penolakan Komuniti Terhadap Kerumitan
Perbincangan mendedahkan kebimbangan yang semakin meningkat tentang kerumitan pengendalian ralat Rust. Sesetengah ahli komuniti berhujah bahawa ekosistem telah merumitkan apa yang sepatutnya pengurusan ralat yang mudah. Mereka menunjukkan bahawa bahasa yang berjaya seperti Python dan Java mengendalikan pengecualian dengan baik dalam projek dunia sebenar, mempersoalkan sama ada pendekatan Rust benar-benar memberikan faedah yang berkadar.
Setiap fungsi boleh gagal dengan StackOverflowError dan anda tidak boleh berbuat apa-apa mengenainya. Hampir setiap fungsi boleh gagal dengan OutOfMemoryError dan anda tidak boleh berbuat apa-apa mengenainya. Saya telah menerima bahawa segala-galanya boleh gagal.
Yang lain mempertahankan ralat berstruktur sebagai penting untuk API perpustakaan, berhujah bahawa pemodelan ralat yang betul mengurangkan kegagalan yang dihadapi pengguna dengan mengorbankan masa pembangun. Perdebatan menyentuh sama ada industri telah tidur dalam pengendalian ralat tanpa pengecualian, dengan pembangun Rust menjadi yang pertama menangani masalah ini dengan serius.
Jurang Dokumentasi dan Amalan Terbaik
Aduan berulang dalam perbincangan komuniti tertumpu pada dokumentasi amalan terbaik Rust yang berselerak. Tidak seperti bahasa dengan panduan gaya berpusat, pembangun Rust mesti memburu melalui catatan blog dan perbincangan komuniti untuk mencari cadangan pengendalian ralat terkini. Perpecahan ini menyukarkan pembangun yang kembali ke Rust untuk mengetahui pendekatan dan corak terbaru.
Garis panduan terperinci pasukan iroh untuk penulisan ralat konkrit - seperti mengskop enum ralat kepada fungsi dan bukannya modul dan memasukkan varian khusus untuk trait awam - mewakili jenis kebijaksanaan praktikal yang diharapkan pembangun lebih terdokumen secara berpusat.
Garis Panduan Pengendalian Ralat Rust daripada Pasukan iroh
- Skop enum ralat kepada fungsi, bukan modul - Menjadikan kategori ralat lebih mudah difahami
- Gunakan nama ralat yang deskriptif -
TicketParseError
berbandingTicketError
menjelaskan skop kegagalan dengan lebih jelas - Sertakan varian Custom untuk trait awam - Membolehkan pelaksana untuk menyebarkan ralat mereka sendiri
- Sediakan kaedah pembantu -
custom_err()
dancustom_err_box()
untuk penciptaan ralat yang mudah
Melihat ke Hadapan: Pragmatisme Berbanding Dogma
Perbincangan komuniti mencadangkan pengiktirafan yang semakin meningkat bahawa projek yang berbeza mempunyai keperluan pengendalian ralat yang berbeza. Walaupun terdapat tekanan untuk memastikan semua perpustakaan mengembalikan ralat konkrit, realiti pragmatik ialah pasukan mesti mengimbangi pelbagai kebimbangan termasuk halaju pembangunan, kestabilan API, dan keupayaan nyahpepijat.
Pendekatan hibrid pasukan iroh - menggunakan ralat berstruktur untuk API awam sambil mengekalkan konteks yang kaya dan backtrace - mungkin mewakili jalan tengah yang praktikal. Walau bagaimanapun, batasan asas dalam cerita pengendalian ralat Rust bermakna sehingga penyebaran backtrace distabilkan, pasukan akan terus membuat pertukaran dan bukannya mencari penyelesaian yang sempurna.
Rujukan: Trying to get error backtraces in rust libraries right