Saya pernah disarankan bahwa program C ++ pada akhirnya harus menangkap semua pengecualian. Alasan yang diberikan pada saat itu pada dasarnya adalah bahwa program yang memungkinkan pengecualian muncul di luar main()
memasuki keadaan zombie yang aneh. Saya diberitahu ini beberapa tahun yang lalu dan dalam retrospeksi saya percaya fenomena yang diamati adalah karena generasi panjang dump inti sangat besar dari proyek tersebut.
Pada saat itu ini tampak aneh tetapi meyakinkan. Itu benar-benar tidak masuk akal bahwa C ++ harus "menghukum" programmer karena tidak menangkap semua pengecualian tetapi bukti sebelum saya tampaknya mendukung hal ini. Untuk proyek yang dimaksud, program yang melemparkan pengecualian tanpa tertangkap tampaknya memasuki keadaan zombie yang aneh - atau seperti yang saya duga penyebabnya sekarang, proses di tengah-tengah pembuangan inti yang tidak diinginkan biasanya sulit untuk dihentikan.
(Bagi siapa pun yang bertanya-tanya mengapa hal ini tidak lebih jelas pada saat itu: Proyek ini menghasilkan sejumlah besar output dalam banyak file dari berbagai proses yang secara efektif mengaburkan semua jenis aborted (core dumped)
pesan dan dalam kasus khusus ini, pemeriksaan post-mortem untuk dump inti tidak dilakukan. itu adalah teknik debugging yang penting sehingga dump inti tidak banyak dipikirkan. Masalah dengan suatu program biasanya tidak tergantung pada akumulasi dari banyak peristiwa dari waktu ke waktu oleh program yang berumur panjang melainkan input awal untuk program yang berumur pendek (< 1 jam) jadi lebih praktis untuk hanya menjalankan kembali program dengan input yang sama dari debug build atau di debugger untuk mendapatkan info lebih lanjut.)
Saat ini, saya tidak yakin apakah ada keuntungan atau kerugian besar dari menangkap pengecualian hanya untuk tujuan mencegah pengecualian pergi main()
.
Keuntungan kecil yang dapat saya pikirkan untuk memungkinkan pengecualian untuk muncul main()
adalah bahwa hal itu menyebabkan hasil std::exception::what()
untuk dicetak ke terminal (setidaknya dengan program yang dikompilasi gcc di Linux). Di sisi lain, ini sepele untuk dicapai dengan alih-alih menangkap semua pengecualian yang berasal dari std::exception
dan mencetak hasil std::exception::what()
dan jika diinginkan untuk mencetak pesan dari pengecualian yang tidak berasal dari std::exception
maka harus ditangkap sebelum pergi main()
untuk mencetak pesan.
Kerugian sederhana yang dapat saya pikirkan untuk memungkinkan pengecualian untuk menggelembungkan masa lalu main()
adalah bahwa dump inti yang tidak diinginkan dapat dihasilkan. Untuk proses yang menggunakan memori dalam jumlah besar, ini bisa menjadi gangguan dan mengendalikan perilaku dumping inti dari suatu program membutuhkan pemanggilan fungsi spesifik OS. Di sisi lain, jika sebuah core dump dan exit diinginkan maka ini dapat dicapai setiap saat dengan menelepon std::abort()
dan keluar tanpa core dump dapat dicapai kapan saja dengan menelepon std::exit()
.
Secara anekdot, saya rasa saya tidak pernah melihat what(): ...
pesan default dicetak oleh program yang didistribusikan secara luas saat mogok.
Apa, jika ada, argumen kuat untuk atau tidak memungkinkan pengecualian C ++ meluap melewati main()
?
Sunting: Ada banyak pengecualian umum yang menangani pertanyaan di situs ini. Pertanyaan saya secara khusus tentang pengecualian C ++ yang tidak dapat ditangani dan berhasil sampai ke sana main()
- mungkin pesan kesalahan dapat dicetak tetapi ini segera menunjukkan kesalahan berhenti.