0Pricing
Lua Academy · บทเรียน

การจัดการสถานะและข้อผิดพลาด

ใช้ lua_pcall สำหรับการเรียกแบบป้องกันและจัดการข้อผิดพลาดในชั้น C

การจัดการสถานะและข้อผิดพลาด เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

สถานะ Lua หลายรายการ

คุณสามารถเรียกใช้อินสแตนซ์ของ lua_State หลายรายการในโพรเซสเดียวกันได้ แต่ละรายการเป็นอิสระจากกันโดยสมบูรณ์ มีตัวแปรส่วนกลางแยกกัน มีสแตกแยกกัน และไม่มีหน่วยความจำที่ใช้ร่วมกันเป็นค่าเริ่มต้น

สถานะเธรด

lua_newthread(L) สร้างเธรดย่อย (โครูทีน) ที่ใช้สภาพแวดล้อมส่วนกลางเดียวกัน แต่มีสแตกของตนเอง นี่คือวิธีที่โครูทีนของ Lua ถูกนำไปใช้ใน C

การแบ่งปันข้อมูลระหว่างสถานะ

ไม่สามารถส่งข้อมูลระหว่างสถานะ Lua ที่เป็นอิสระต่อกันได้โดยตรง ให้แปลงข้อมูลเป็นสตริง หรือใช้โครงสร้างหน่วยความจำที่ใช้ร่วมกันฝั่ง C ซึ่งเข้าถึงได้ผ่านข้อมูลผู้ใช้

การเรียกใช้แบบมีการป้องกันเทียบกับการเรียกใช้แบบดิบ

lua_pcall จะดักจับข้อผิดพลาด (ภายในใช้ setjmp/longjmp) ส่วน lua_call จะส่งต่อข้อผิดพลาดและยุติโปรแกรม ควรใช้ lua_pcall ในระบบจริงเสมอ

// Safe:
if (lua_pcall(L, nargs, nresults, 0) != LUA_OK) {
  const char *err = lua_tostring(L, -1);
  lua_pop(L, 1);
  // handle error
}

วัตถุข้อผิดพลาด

ข้อผิดพลาดใน Lua อาจเป็นค่าใด ๆ ก็ได้ ไม่จำเป็นต้องเป็นสตริงเท่านั้น error({code=404, msg="not found"}) จะส่งตารางเป็นข้อผิดพลาด โค้ด C จะอ่านตารางนี้จากสแตกเมื่อ pcall ล้มเหลว

ตัวจัดการแพนิก

หากข้อผิดพลาดหลุดออกจาก pcall (เช่น เกิดจากฟังก์ชัน C ที่ถูกเรียกโดยไม่มีการป้องกัน) Lua จะเรียกใช้ตัวจัดการแพนิกที่ตั้งค่าผ่าน lua_atpanic(L, fn) ก่อนยุติการทำงาน

// C code
lua_atpanic(L, function(lua_State *L) {
  fprintf(stderr, "PANIC: %s\n", lua_tostring(L, -1));
  exit(1);
  return 0;
});

การคืนสภาพสแตกเมื่อเกิดข้อผิดพลาด

หลังจาก lua_pcall เกิดข้อผิดพลาด สแตกจะถูกคืนกลับไปยังสภาพก่อนการเรียกใช้ (ลบฟังก์ชันและอาร์กิวเมนต์ออก แล้วเพิ่มวัตถุข้อผิดพลาดไว้ด้านบน)

การล้างสถานะ

เมื่อใช้งานเสร็จแล้วควรปิดสถานะด้วย lua_close(L) เสมอ การทำเช่นนี้จะเรียกใช้ตัวทำลาย __gc ทั้งหมดและคืนหน่วยความจำที่จัดสรรไว้ทั้งหมด

ความปลอดภัยในการทำงานหลายเธรด

สถานะ Lua ไม่ปลอดภัยสำหรับการทำงานหลายเธรด อย่าเรียกใช้ฟังก์ชัน C API สองฟังก์ชันกับสถานะเดียวกันพร้อมกัน ใช้สถานะหนึ่งรายการต่อเธรด OS หรือใช้มิวเท็กซ์เพื่อจัดลำดับการเข้าถึง

ตัวจัดสรรหน่วยความจำ

โดยค่าเริ่มต้น Lua ใช้ realloc คุณสามารถระบุตัวจัดสรรแบบกำหนดเองด้วย lua_newstate(allocFn, ud) เพื่อการติดตามหน่วยความจำ การจำกัดหน่วยความจำ หรือกลุ่มหน่วยความจำแบบกำหนดเอง

การทำแซนด์บ็อกซ์ด้วยสถานะหลายรายการ

เรียกใช้โค้ดที่ไม่น่าเชื่อถือในสถานะ Lua ใหม่ที่แยกออกจากกันและไม่ได้เปิดไลบรารีมาตรฐาน การหยุดทำงานหรือการใช้ทรัพยากรจนหมดจะถูกจำกัดอยู่ภายในสถานะนั้น

คำถามเกี่ยวกับการจัดการข้อผิดพลาด

ความแตกต่างระหว่าง lua_call กับ lua_pcall คืออะไร

ทบทวน: การจัดการสถานะและข้อผิดพลาด

ใช้ lua_pcall (อย่าใช้ lua_call) ในระบบจริง ตั้งค่าตัวจัดการแพนิกสำหรับการกู้คืนในกรณีสุดท้าย ใช้สถานะหนึ่งรายการต่อเธรด ใช้สถานะหลายรายการที่แยกจากกันสำหรับการทำแซนด์บ็อกซ์ และเรียกใช้ lua_close เพื่อล้างข้อมูลเสมอ

คำถามที่พบบ่อย

บทเรียน “การจัดการสถานะและข้อผิดพลาด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจัดการสถานะและข้อผิดพลาด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจัดการสถานะและข้อผิดพลาด”

ใช้ lua_pcall สำหรับการเรียกแบบป้องกันและจัดการข้อผิดพลาดในชั้น C คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การจัดการสถานะและข้อผิดพลาด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แบบจำลองสแตกของ Lua C API
  2. การเรียกฟังก์ชัน Lua จาก C
  3. การลงทะเบียนฟังก์ชัน C ใน Lua
  4. การจัดการสถานะและข้อผิดพลาด
← กลับไปที่ Lua Academy