โดยทั่วไปแล้วในที่สุดก็จะทำงาน
สำหรับสามสถานการณ์ต่อไปนี้ในที่สุดจะรันเสมอ :
- ไม่มีข้อยกเว้นเกิดขึ้น
- ข้อยกเว้นแบบซิงโครนัส (ข้อยกเว้นที่เกิดขึ้นในโฟลว์โปรแกรมปกติ)
ซึ่งรวมถึงข้อยกเว้นที่สอดคล้องกับ CLS ที่ได้รับมาจากข้อยกเว้นของ System.Exception และ non-CLS ซึ่งไม่ได้มาจาก System.Exception ข้อยกเว้นที่สอดคล้องกับ Non-CLS จะถูกห่อโดยอัตโนมัติโดย RuntimeWrappedException C # ไม่สามารถโยนข้อยกเว้นการร้องเรียนที่ไม่ใช่ CLS แต่ภาษาเช่น C ++ สามารถ C # อาจเรียกใช้รหัสที่เขียนด้วยภาษาที่สามารถยกเว้นข้อยกเว้นที่ไม่สอดคล้องกับ CLS
- Asynchronous ThreadAbortException
ณ . NET 2.0, ThreadAbortException จะไม่ป้องกันการเรียกใช้ในที่สุด ThreadAbortException จะถูกยกไปก่อนหรือหลังในที่สุด ในที่สุดจะทำงานเสมอและจะไม่ถูกขัดจังหวะโดยการยกเลิกเธรดตราบใดที่การลองถูกป้อนจริงก่อนที่การยกเลิกเธรดจะเกิดขึ้น
สถานการณ์สมมติต่อไปนี้ในที่สุดจะไม่ทำงาน:
Asynchronous StackOverflowException
ในฐานะที่เป็น. NET 2.0 ล้นสแต็คจะทำให้กระบวนการที่จะยุติ ในที่สุดจะไม่สามารถทำงานได้เว้นแต่จะมีข้อ จำกัด เพิ่มเติมในการทำให้ CER (ขอบเขตการบังคับใช้ข้อ จำกัด ) ในที่สุด ไม่ควรใช้ CER ในรหัสผู้ใช้ทั่วไป พวกเขาควรจะใช้เฉพาะในกรณีที่มีความสำคัญอย่างยิ่งที่โค้ดการทำความสะอาดจะทำงานอยู่เสมอ - หลังจากกระบวนการทั้งหมดถูกปิดลงในสแต็กโอเวอร์โฟลว์ต่อไปและดังนั้นวัตถุที่มีการจัดการทั้งหมดจะถูกล้างข้อมูลตามค่าเริ่มต้น ดังนั้นที่เดียวที่ควรมีความเกี่ยวข้องคือ CER สำหรับทรัพยากรที่ได้รับการจัดสรรนอกกระบวนการเช่นการจัดการที่ไม่มีการจัดการ
โดยทั่วไปรหัสที่ไม่มีการจัดการจะถูกห่อด้วยคลาสที่ได้รับการจัดการบางส่วนก่อนที่จะถูกใช้โดยรหัสผู้ใช้ คลาส wrapper ที่ได้รับการจัดการมักจะใช้ SafeHandle เพื่อตัดจุดจับที่ไม่มีการจัดการ SafeHandle ดำเนินการขั้นสุดท้ายที่สำคัญและวิธีการเผยแพร่ที่เรียกใช้ใน CER เพื่อรับประกันการทำงานของรหัสการล้างข้อมูล ด้วยเหตุนี้คุณไม่ควรเห็นรหัสผู้ใช้หมดเกลี้ยง CERs
ดังนั้นความจริงที่ว่าสุดท้ายก็ไม่ได้ทำงานบน StackOverflowException ไม่ควรมีผลกระทบต่อรหัสผู้ใช้เนื่องจากกระบวนการจะยุติการทำงานต่อไป หากคุณมีกรณีขอบที่คุณจำเป็นต้องล้างทรัพยากรที่ไม่มีการจัดการนอก SafeHandle หรือ CriticalFinalizerObject ให้ใช้ CER ดังนี้ แต่โปรดทราบว่านี่เป็นแนวปฏิบัติที่ไม่ดี - แนวคิดที่ไม่มีการจัดการควรถูกแยกออกเป็นคลาสที่มีการจัดการและ SafeHandle (s) ที่เหมาะสมโดยการออกแบบ
เช่น,
// No code can appear after this line, before the try
RuntimeHelpers.PrepareConstrainedRegions();
try
{
// This is *NOT* a CER
}
finally
{
// This is a CER; guaranteed to run, if the try was entered,
// even if a StackOverflowException occurs.
}