ฉันได้รับคำแนะนำครั้งหนึ่งว่าในที่สุดโปรแกรม C ++ ควรจะได้รับการยกเว้นทั้งหมด เหตุผลที่ให้ไว้ในขณะนั้นคือโปรแกรมที่อนุญาตให้มีการยกเว้นเกิดฟองขึ้นนอกmain()
เข้าสู่สถานะผีดิบแปลก ๆ ฉันบอกเรื่องนี้เมื่อหลายปีก่อนและในการหวนกลับฉันเชื่อว่าปรากฏการณ์ที่สังเกตได้เกิดจากการทิ้งแกนกลางขนาดใหญ่ที่ยาวเป็นพิเศษจากโครงการที่สงสัย
ในเวลานี้ดูเหมือนจะแปลก แต่น่าเชื่อถือ มันไร้สาระโดยสิ้นเชิงที่ C ++ ควร "ลงโทษ" โปรแกรมเมอร์ที่ไม่จับข้อยกเว้นทั้งหมด แต่หลักฐานก่อนหน้าฉันดูเหมือนจะสำรองข้อมูลนี้ไว้ สำหรับโครงการที่มีปัญหาโปรแกรมที่โยนข้อยกเว้นที่ไม่ได้ตรวจจับนั้นดูเหมือนจะเข้าสู่สถานะผีดิบแปลก ๆ หรืออย่างที่ฉันคิดว่าสาเหตุอยู่ในขณะนี้กระบวนการที่อยู่ท่ามกลางการถ่ายโอนข้อมูลหลักที่ไม่ต้องการนั้นยากที่จะหยุด
(สำหรับทุกคนที่สงสัยว่าทำไมสิ่งนี้ถึงไม่ชัดเจนในเวลานั้น: โครงการสร้างเอาต์พุตจำนวนมากในหลายไฟล์จากหลายกระบวนการซึ่งบดบังaborted (core dumped)
ข้อความประเภทใด ๆ ได้อย่างมีประสิทธิภาพและในกรณีนี้การตรวจสอบการตายของแกนทิ้งไม่ได้ ไม่ใช่เทคนิคการดีบักที่สำคัญดังนั้นการถ่ายโอนข้อมูลหลักจึงไม่ได้รับการคิดมากปัญหาของโปรแกรมมักจะไม่ได้ขึ้นอยู่กับสถานะที่สะสมจากเหตุการณ์ต่าง ๆ ในช่วงเวลาหนึ่งโดยโปรแกรมที่ใช้งานมานาน 1 ชั่วโมง) ดังนั้นจึงมีประโยชน์มากกว่าที่จะรันโปรแกรมอีกครั้งโดยใช้อินพุตเดียวกันจากการสร้างข้อบกพร่องหรือในตัวดีบักเพื่อรับข้อมูลเพิ่มเติม)
ขณะนี้ผมไม่แน่ใจว่ามีความได้เปรียบที่สำคัญใด ๆ main()
หรือข้อเสียของการจับข้อยกเว้นเพียงเพื่อวัตถุประสงค์ในการป้องกันการยกเว้นจากการออก
ข้อได้เปรียบเล็ก ๆ น้อย ๆ ที่ฉันคิดได้ในการยอมให้มีข้อยกเว้นเกิดฟองขึ้นในอดีตmain()
คือทำให้เกิดผลลัพธ์std::exception::what()
ที่จะพิมพ์ไปยังเทอร์มินัล (อย่างน้อยก็ด้วยโปรแกรมที่คอมไพล์ด้วย gcc บน Linux) บนมืออื่น ๆ นี้เป็นที่น่ารำคาญที่จะบรรลุโดยแทนที่จะจับข้อยกเว้นทั้งหมดมาจากstd::exception
และการพิมพ์ผลมาจากstd::exception::what()
และถ้ามันเป็นที่พึงปรารถนาที่จะพิมพ์ข้อความจากข้อยกเว้นที่ไม่ได้มาจากstd::exception
นั้นก็จะต้องถูกจับก่อนที่จะออกmain()
เพื่อพิมพ์ ข้อความ.
ข้อเสียเปรียบเล็กน้อยที่ฉันสามารถคิดได้ในการอนุญาตให้มีการยกเว้นเกิดฟองขึ้นในอดีตmain()
คือการทิ้งขยะที่ไม่ต้องการ สำหรับกระบวนการที่ใช้หน่วยความจำจำนวนมากสิ่งนี้อาจสร้างความรำคาญและควบคุมพฤติกรรมการถ่ายโอนข้อมูลหลักจากโปรแกรมที่ต้องการการเรียกใช้ฟังก์ชันเฉพาะระบบปฏิบัติการ ในทางตรงกันข้ามถ้าถ่ายโอนข้อมูลหลักและออกเป็นที่ต้องการแล้วนี้อาจแทนจะประสบความสำเร็จในเวลาใด ๆ โดยการโทรและการออกโดยไม่ต้องถ่ายโอนข้อมูลหลักสามารถทำได้ในเวลาใดก็ได้โดยการเรียกstd::abort()
std::exit()
โดยทั่วไปฉันไม่คิดว่าฉันเคยเห็นwhat(): ...
ข้อความเริ่มต้นที่พิมพ์โดยโปรแกรมที่มีการกระจายอย่างกว้างขวางเมื่อระบบขัดข้อง
อะไรคือข้อโต้แย้งที่แข็งแกร่งสำหรับหรือต่อต้านการอนุญาตให้มีการยกเว้น C ++ เพื่อทำให้เกิดฟองที่ผ่านมาmain()
?
แก้ไข:มีคำถามการจัดการข้อยกเว้นทั่วไปจำนวนมากในไซต์นี้ คำถามของฉันเกี่ยวกับข้อยกเว้น C ++ โดยเฉพาะที่ไม่สามารถจัดการได้และทำให้เป็นไปได้ทั้งหมดmain()
- อาจมีข้อความแสดงข้อผิดพลาด แต่สามารถพิมพ์ได้ทันที