defer เทียบกับ errdefer ในทางปฏิบัติ
เลือกแบบทำงานเสมอหรือทำงานเมื่อเกิดข้อผิดพลาด
defer เทียบกับ errdefer ในทางปฏิบัติ เป็นบทเรียน Zig Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Zig Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
คำสำคัญสำหรับการเก็บกวาดสองแบบ
Zig มีเครื่องมือกำหนดเวลาสองแบบ: defer ทำงานเสมอ ส่วน errdefer ทำงานเฉพาะเมื่อ scope สิ้นสุดพร้อมข้อผิดพลาด
defer หมายถึงทำเสมอ
ใช้ defer เมื่อการเก็บกวาดต้องเกิดขึ้นไม่ว่าอะไรจะเกิด เช่น การปิดไฟล์ที่คุณเปิดไว้ตลอดทั้งฟังก์ชัน
const f = try open();
defer f.close();errdefer หมายถึงทำเมื่อไม่สำเร็จ
errdefer จะทำงานเฉพาะเมื่อ scope ออกจากฟังก์ชันด้วยข้อผิดพลาด หากคืนค่าสำเร็จก็จะถูกข้ามไปอย่างเงียบ ๆ
const buf = try alloc();
errdefer free(buf);เหตุผลที่ข้ามเมื่อสำเร็จ
บางครั้งคุณสร้างค่าเพื่อ คืนค่านั้น เมื่อสำเร็จ ผู้เรียกจะเป็นเจ้าของค่า ดังนั้นคุณต้องไม่ free ค่านั้น และ errdefer ก็เคารพกฎนี้
ออบเจ็กต์ที่สร้างไม่เสร็จ
errdefer มีประโยชน์มากใน ตัวสร้าง หากขั้นตอนภายหลังล้มเหลว มันจะย้อนคืนการจองหน่วยความจำก่อนหน้า จึงไม่เกิดการรั่วไหลของออบเจ็กต์ที่สร้างค้างไว้
const a = try alloc();
errdefer free(a);
const b = try alloc();เมื่อสำเร็จจึงโอนความเป็นเจ้าของ
เมื่อทุกขั้นตอนสำเร็จ ฟังก์ชันจะคืนค่า และ errdefer จะไม่ทำงาน ความเป็นเจ้าของจึงโอนไปยังผู้เรียกได้อย่างเรียบร้อย
return MyType{ .a = a, .b = b };ใช้ร่วมกันได้อย่างลงตัว
คุณสามารถใช้ทั้งสองแบบร่วมกันได้ defer ดูแลหน่วยความจำชั่วคราวที่ใช้ทำงาน ส่วน errdefer ปกป้องผลลัพธ์ที่คุณวางแผนจะคืน
ทั้งสองแบบเคารพลำดับย้อนกลับ
เช่นเดียวกับ defer, errdefer หลายรายการจะถูกนำออกตามลำดับ ย้อนกลับ เมื่อเกิดข้อผิดพลาด Zig จะเรียกใช้ defer และ errdefer ที่ตรงกันร่วมกัน โดยเริ่มจากรายการใหม่สุด
ตำแหน่งมีความสำคัญ
วาง errdefer แต่ละรายการไว้ ทันทีหลังขั้นตอนที่รายการนั้นปกป้องอยู่ เพราะมันจะดูแลเฉพาะข้อผิดพลาดที่เกิดหลังจากมาถึงบรรทัดของตัวเอง
กฎง่าย ๆ
ถามเพียงคำถามเดียว: การเก็บกวาดนี้ควรทำเมื่อสำเร็จด้วยหรือไม่ หากใช่ ให้ใช้ defer หากทำเฉพาะเมื่อเกิดข้อผิดพลาด ให้ใช้ errdefer
ปลอดจากการรั่วไหลตั้งแต่การออกแบบ
คำสำคัญทั้งสองช่วยให้คุณเขียนฟังก์ชันที่ ไม่มีทรัพยากรรั่วไหล ในทุกเส้นทาง ไม่ว่าจะสำเร็จหรือล้มเหลว โดยไม่ต้องติดตามด้วยตนเอง
ตรวจสอบความเข้าใจ
errdefer ทำงานเมื่อใดเมื่อเทียบกับ defer
สรุปทบทวน
เลือกใช้ defer เมื่อการเก็บกวาดต้องทำเสมอ และใช้ errdefer เมื่อต้องการย้อนคืนการทำงานเฉพาะบนเส้นทางที่เกิดข้อผิดพลาด ✅
คำถามที่พบบ่อย
บทเรียน “defer เทียบกับ errdefer ในทางปฏิบัติ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “defer เทียบกับ errdefer ในทางปฏิบัติ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Zig Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Zig Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “defer เทียบกับ errdefer ในทางปฏิบัติ”
เลือกแบบทำงานเสมอหรือทำงานเมื่อเกิดข้อผิดพลาด คุณปฏิบัติ Zig Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Zig Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Zig Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “defer เทียบกับ errdefer ในทางปฏิบัติ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Zig Academy นี้ได้ไหม
ได้ บทเรียน Zig Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สิ่งที่ defer รับประกัน
- ลำดับการทำงานของ defer หลายรายการ
- defer เทียบกับ errdefer ในทางปฏิบัติ
- จับคู่ Open กับ Close