Jika suatu bahasa secara inheren mendukung pengecualian, maka lebih disukai untuk melemparkan pengecualian dan klien dapat menangkap pengecualian jika mereka tidak ingin itu mengakibatkan kegagalan. Faktanya, klien kode Anda mengharapkan pengecualian dan akan mengalami banyak bug karena mereka tidak akan memeriksa nilai pengembalian.
Ada beberapa keuntungan menggunakan pengecualian jika Anda punya pilihan.
Pesan
Pengecualian berisi pesan kesalahan yang dapat dibaca pengguna yang dapat digunakan oleh pengembang untuk debugging atau bahkan ditampilkan kepada pengguna jika diinginkan. Jika kode pengkonsumsi tidak dapat menangani pengecualian, selalu dapat mencatatnya sehingga pengembang dapat menelusuri log tanpa harus berhenti di setiap penelusuran lainnya untuk mencari tahu apa nilai pengembalian dan memetakannya dalam tabel untuk mencari tahu apa yang menjadi pengecualian aktual.
Dengan nilai pengembalian, tidak ada informasi tambahan yang dapat diberikan dengan mudah. Beberapa bahasa akan mendukung pembuatan panggilan metode untuk mendapatkan pesan kesalahan terakhir, sehingga masalah ini sedikit berkurang, tetapi itu membutuhkan penelepon untuk membuat panggilan tambahan dan kadang-kadang akan memerlukan akses ke 'objek khusus' yang membawa informasi ini.
Dalam hal pesan pengecualian, saya memberikan konteks sebanyak mungkin, seperti:
Kebijakan nama "foo" tidak dapat diambil untuk "bilah" pengguna, yang dirujuk di profil pengguna.
Bandingkan ini dengan kode pengembalian -85. Manakah yang Anda pilih?
Panggil tumpukan
Pengecualian biasanya juga memiliki tumpukan panggilan terperinci yang membantu men-debug kode lebih cepat dan lebih cepat, dan juga dapat dicatat oleh kode panggilan jika diinginkan. Ini memungkinkan pengembang untuk menentukan masalah biasanya ke garis yang tepat, dan karenanya sangat kuat. Sekali lagi, bandingkan ini dengan file log dengan nilai balik (seperti -85, 101, 0, dll.), Yang mana yang Anda inginkan?
Pendekatan bias cepat gagal
Jika suatu metode dipanggil di suatu tempat yang gagal, itu akan mengeluarkan pengecualian. Kode panggilan harus menekan pengecualian secara eksplisit atau akan gagal. Saya telah menemukan ini benar-benar luar biasa karena selama pengembangan dan pengujian (dan bahkan dalam produksi) kode gagal dengan cepat, memaksa pengembang untuk memperbaikinya. Dalam hal nilai pengembalian, jika pemeriksaan untuk nilai balik terlewatkan, kesalahan diabaikan secara diam-diam dan bug muncul di tempat yang tidak terduga, biasanya dengan biaya yang jauh lebih tinggi untuk debug dan perbaikan.
Pengecualian Pembungkus dan Pembukaan
Pengecualian dapat dimasukkan ke dalam pengecualian lain dan kemudian dibuka jika diperlukan. Misalnya, kode Anda mungkin dilempar ke ArgumentNullException
mana kode panggilan mungkin membungkus di dalam UnableToRetrievePolicyException
karena operasi itu gagal dalam kode panggilan. Sementara pengguna mungkin diperlihatkan pesan yang mirip dengan contoh yang saya berikan di atas, beberapa kode diagnostik mungkin membuka bukaan pengecualian dan menemukan bahwa ArgumentNullException
telah menyebabkan masalah, yang berarti itu adalah kesalahan pengkodean dalam kode konsumen Anda. Ini kemudian dapat mengaktifkan peringatan sehingga pengembang dapat memperbaiki kode. Skenario lanjutan seperti itu tidak mudah diimplementasikan dengan nilai pengembalian.
Kesederhanaan kode
Yang ini sedikit lebih sulit untuk dijelaskan, tetapi saya belajar melalui pengkodean ini baik dengan nilai pengembalian maupun pengecualian. Kode yang ditulis menggunakan nilai kembali biasanya akan melakukan panggilan dan kemudian memiliki serangkaian pemeriksaan pada apa nilai balik itu. Dalam beberapa kasus, itu akan membuat panggilan ke metode lain, dan sekarang akan memiliki serangkaian pemeriksaan untuk nilai-nilai kembali dari metode itu. Dengan pengecualian, penanganan pengecualian jauh lebih sederhana di sebagian besar atau tidak semua kasus. Anda memiliki blok coba / tangkap / akhirnya, dengan runtime mencoba yang terbaik untuk mengeksekusi kode di blok akhirnya untuk pembersihan. Bahkan blok try / catch / akhirnya yang bersarang relatif lebih mudah untuk ditindaklanjuti dan dipelihara dibandingkan dengan nested if / else dan nilai pengembalian terkait dari berbagai metode.
Kesimpulan
Jika platform yang Anda gunakan mendukung pengecualian (khususnya Java atau .NET), maka Anda harus mengasumsikan bahwa tidak ada cara lain selain melempar pengecualian karena platform ini memiliki panduan untuk melempar pengecualian, dan klien Anda akan mengharapkan begitu. Jika saya menggunakan perpustakaan Anda, saya tidak akan repot untuk memeriksa nilai kembali karena saya perkirakan pengecualian akan dilempar, seperti itulah dunia di platform ini.
Namun, jika itu adalah C ++, maka itu akan sedikit lebih sulit untuk ditentukan karena basis kode yang besar sudah ada dengan kode kembali, dan sejumlah besar pengembang disetel untuk mengembalikan nilai yang bertentangan dengan pengecualian (misalnya Windows penuh dengan HRESULT) . Selain itu, dalam banyak aplikasi, itu bisa menjadi masalah kinerja juga (atau setidaknya dianggap).
try
/catch
ada. Selain itu, Anda dapat meletakkantry
/catch
lebih jauh ke atas tumpukan di lokasi yang lebih tepat untuk menanganinya (memungkinkan pemisahan masalah yang lebih besar).