Saya melihat dua pertanyaan penting yang menentukan jawaban untuk ini:
- Bisakah fungsi Anda mengembalikan sesuatu yang bermakna dan logis ketika melewati koleksi kosong (termasuk nol )?
- Apa gaya pemrograman umum dalam aplikasi / perpustakaan / tim ini? (Secara khusus, bagaimana FP Anda?)
1. Pengembalian yang berarti
Intinya, jika Anda bisa mengembalikan sesuatu yang bermakna, maka jangan melemparkan pengecualian. Biarkan penelepon berurusan dengan hasilnya. Jadi jika fungsi Anda ...
- Menghitung jumlah elemen dalam koleksi, mengembalikan 0. Itu mudah.
- Mencari elemen yang cocok dengan kriteria tertentu, mengembalikan koleksi kosong. Tolong jangan membuang apa pun. Penelepon mungkin memiliki banyak koleksi, beberapa di antaranya kosong, beberapa tidak. Penelepon menginginkan elemen yang cocok dalam koleksi apa pun. Pengecualian hanya membuat hidup penelepon lebih sulit.
- Sedang mencari kriteria terbesar / terkecil / paling cocok dengan-dalam-daftar. Ups. Bergantung pada pertanyaan gaya, Anda mungkin melempar pengecualian di sini atau Anda dapat mengembalikan nol . Saya benci nol (sangat banyak orang FP) tetapi ini bisa dibilang lebih bermakna di sini dan memungkinkan Anda memesan pengecualian untuk kesalahan tak terduga dalam kode Anda sendiri. Jika pemanggil tidak memeriksa nol, pengecualian yang cukup jelas akan tetap terjadi. Tapi Anda serahkan itu pada mereka.
- Meminta item ke-n dalam koleksi atau item pertama / terakhir. Ini adalah kasus terbaik untuk pengecualian dan kasus yang paling tidak menyebabkan kebingungan dan kesulitan bagi penelepon. Kasing masih dapat dibuat untuk null jika Anda dan tim Anda terbiasa memeriksa untuk itu, untuk semua alasan yang diberikan pada poin sebelumnya, tetapi ini adalah kasing yang paling valid untuk melempar Dude. Anda Tahu Anda Harus Memeriksa Pengecualian. Jika gaya Anda lebih fungsional, maka batal atau baca terus jawaban Gaya saya .
Secara umum, bias FP saya memberi tahu saya - mengembalikan sesuatu yang bermakna - dan nol dapat memiliki arti yang valid dalam kasus ini.
2. Gaya
Apakah kode umum Anda (atau kode proyek atau kode tim) mendukung gaya fungsional? Jika tidak, pengecualian akan diharapkan dan ditangani. Jika ya, maka pertimbangkan untuk mengembalikan Tipe Opsi . Dengan jenis opsi, Anda bisa mengembalikan jawaban yang bermakna atau Tidak Ada / Tidak Ada . Dalam contoh ketiga saya dari atas, Tidak ada yang akan menjadi jawaban yang baik dalam gaya FP. Fakta bahwa fungsi mengembalikan sinyal Tipe opsi dengan jelas kepada penelepon daripada jawaban yang bermakna mungkin tidak mungkin dan penelepon harus siap untuk menghadapinya. Saya merasa itu memberi penelepon lebih banyak pilihan (jika Anda akan memaafkan permainan kata-kata).
F # adalah di mana semua keren Net anak-anak melakukan hal semacam ini tetapi C # tidak mendukung gaya ini.
tl; dr
Simpan pengecualian untuk kesalahan tak terduga di jalur kode Anda sendiri, tidak sepenuhnya input (dan legal) yang dapat diprediksi dari orang lain.