ดังนั้นคำถามของฉันคือ - หากการขว้างปาจาก destructor ส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนดคุณจะจัดการกับข้อผิดพลาดที่เกิดขึ้นระหว่าง destructor ได้อย่างไร
ปัญหาหลักคือ: คุณไม่สามารถล้มเหลวที่จะล้มเหลว หลังจากล้มเหลวหมายความว่าอย่างไร หากการทำธุรกรรมกับฐานข้อมูลล้มเหลวและล้มเหลวในการล้มเหลว (ล้มเหลวในการย้อนกลับ) จะเกิดอะไรขึ้นกับความสมบูรณ์ของข้อมูลของเรา
เนื่องจาก destructors ถูกเรียกใช้สำหรับพา ธ ทั้งปกติและพิเศษ (ล้มเหลว) พวกเขาจึงไม่สามารถล้มเหลวหรืออย่างอื่นที่เรา "ล้มเหลวในการล้มเหลว"
นี่เป็นปัญหาที่เกิดจากแนวคิดรวบยอด แต่บ่อยครั้งวิธีแก้ไขก็คือการหาวิธีที่จะทำให้แน่ใจว่าการล้มเหลวนั้นไม่สามารถล้มเหลวได้ ตัวอย่างเช่นฐานข้อมูลอาจเขียนการเปลี่ยนแปลงก่อนที่จะกระทำกับโครงสร้างข้อมูลภายนอกหรือไฟล์ หากการทำธุรกรรมล้มเหลวโครงสร้างไฟล์ / ข้อมูลสามารถถูกโยนทิ้งได้ สิ่งที่ต้องทำคือให้แน่ใจว่าการยอมรับการเปลี่ยนแปลงจากโครงสร้าง / ไฟล์ภายนอกนั้นเป็นธุรกรรมอะตอมมิกที่ไม่สามารถล้มเหลวได้
วิธีแก้ปัญหาในทางปฏิบัติอาจเป็นเพียงการทำให้แน่ใจว่าโอกาสในการล้มเหลวจากความล้มเหลวนั้นไม่น่าเป็นไปได้ทางดาราศาสตร์เนื่องจากการทำสิ่งที่เป็นไปไม่ได้ให้ล้มเหลวนั้นเป็นไปไม่ได้ในบางกรณี
ทางออกที่เหมาะสมที่สุดสำหรับฉันคือการเขียนตรรกะที่ไม่ใช่การล้างข้อมูลของคุณในลักษณะที่ตรรกะการล้างข้อมูลไม่สามารถล้มเหลว ตัวอย่างเช่นหากคุณถูกล่อลวงให้สร้างโครงสร้างข้อมูลใหม่เพื่อล้างโครงสร้างข้อมูลที่มีอยู่บางทีคุณอาจต้องการสร้างโครงสร้างเสริมนั้นล่วงหน้าเพื่อที่เราจะได้ไม่ต้องสร้างโครงสร้างภายใน destructor อีกต่อไป
ทั้งหมดนี้พูดได้ง่ายกว่าทำเสร็จเป็นที่ยอมรับ แต่เป็นวิธีเดียวที่ฉันเห็นว่าเหมาะสม บางครั้งฉันคิดว่าควรมีความสามารถในการเขียนตรรกะ destructor ที่แยกต่างหากสำหรับเส้นทางการดำเนินการปกติออกไปจากคนพิเศษเนื่องจากบางครั้ง destructors รู้สึกเล็กน้อยเหมือนพวกเขามีความรับผิดชอบเป็นสองเท่าโดยพยายามที่จะจัดการทั้งสอง (ตัวอย่างคือ พวกเขาไม่ต้องการสิ่งนี้หากพวกเขาสามารถแยกแยะเส้นทางการทำลายที่ไม่ธรรมดาจากที่ไม่ได้รับการยกเว้น)
ปัญหาที่สำคัญที่สุดคือเราไม่สามารถล้มเหลวได้และเป็นปัญหาการออกแบบแนวคิดที่ยากที่จะแก้ไขอย่างสมบูรณ์ในทุกกรณี มันจะง่ายขึ้นถ้าคุณไม่ห่อหุ้มโครงสร้างการควบคุมที่ซับซ้อนด้วยวัตถุเล็ก ๆ จำนวนมากที่มีปฏิสัมพันธ์ซึ่งกันและกันและแทนที่จะสร้างแบบจำลองการออกแบบของคุณในแบบที่มีลักษณะเป็นกลุ่มเล็กน้อย (ตัวอย่าง: ระบบอนุภาคที่มีตัวทำลายเพื่อทำลายอนุภาคทั้งหมด ระบบไม่ใช่ destructor แบบไม่แยกย่อยต่ออนุภาค) เมื่อคุณสร้างแบบจำลองการออกแบบของคุณในระดับ coarser เช่นนี้คุณมี destructors ที่ไม่น่ารำคาญน้อยกว่าที่จะจัดการกับและยังสามารถจ่ายสิ่งที่หน่วยความจำ / การประมวลผลมักจะต้องใช้เพื่อให้แน่ใจว่า destructors ของคุณไม่สามารถล้มเหลว
และนั่นเป็นหนึ่งในวิธีแก้ปัญหาที่ง่ายที่สุดตามธรรมชาติคือการใช้ destructors น้อยกว่าบ่อยครั้ง ในตัวอย่างของอนุภาคด้านบนอาจเป็นการทำลาย / กำจัดอนุภาคบางสิ่งที่ควรทำซึ่งอาจล้มเหลวได้ไม่ว่าด้วยเหตุผลใดก็ตาม ในกรณีดังกล่าวแทนที่จะเรียกใช้ตรรกะดังกล่าวผ่าน dtor ของอนุภาคซึ่งสามารถดำเนินการในเส้นทางที่พิเศษคุณสามารถทำได้โดยระบบอนุภาคทั้งหมดเมื่อมันกำจัดอนุภาค การกำจัดอนุภาคอาจทำได้ตลอดเวลาในเส้นทางที่ไม่ธรรมดา หากระบบถูกทำลายอาจเป็นเพียงการล้างอนุภาคทั้งหมดและไม่ต้องกังวลกับตรรกะการกำจัดอนุภาคที่สามารถล้มเหลวในขณะที่ตรรกะที่สามารถล้มเหลวจะดำเนินการเฉพาะในระหว่างการดำเนินการตามปกติของระบบอนุภาคเมื่อเอาอนุภาคหนึ่งหรือมากกว่า
มักจะมีวิธีการแก้ปัญหาเช่นเดียวกับสิ่งที่เกิดขึ้นหากคุณหลีกเลี่ยงการรับมือกับวัตถุเล็ก ๆ จำนวนมากที่มีตัวทำลายแบบไร้สาระ ที่คุณสามารถพันกันยุ่ง ๆ ซึ่งดูเหมือนว่าเป็นไปไม่ได้เลยที่จะยกเว้นความปลอดภัยคือเมื่อคุณพันกันไปในวัตถุเล็ก ๆ ที่ทุกคนมี dtors ที่ไม่สำคัญ
มันจะช่วยได้มากถ้า nothrow / noexcept แปลจริงเป็นข้อผิดพลาดของคอมไพเลอร์หากมีสิ่งใดที่ระบุไว้ (รวมถึงฟังก์ชั่นเสมือนจริงซึ่งควรสืบทอดข้อกำหนด noexcept ของคลาสพื้นฐาน) พยายามเรียกใช้สิ่งใดก็ตามที่สามารถโยนได้ วิธีนี้เราจะสามารถรวบรวมข้อมูลทั้งหมดนี้ได้ในเวลารวบรวมถ้าเราเขียน destructor โดยไม่ตั้งใจซึ่งสามารถโยนได้