บทช่วยสอน Lua จัดการข้อผิดพลาด ที่ดีที่สุดในปี 2024 ในบทช่วยสอนนี้ คุณสามารถเรียนรู้ ไวยากรณ์ผิดพลาด,ข้อผิดพลาด Runtime,จัดการข้อผิดพลาด,pcall และ xpcall แก้ปัญหา,
การจัดการโปรแกรมการทำงานข้อผิดพลาดเป็นสิ่งที่จำเป็นในการดำเนินงานไฟล์การถ่ายโอนข้อมูลและบริการเว็บภาวนาของเราจะปรากฏในข้อผิดพลาดที่ไม่คาดคิด หากคุณไม่ได้ให้ความสนใจที่จะจัดการกับข้อความผิดพลาดตามที่ข้อมูลจะรั่วไหลไม่สามารถเรียกใช้และอื่น ๆ
การเขียนโปรแกรมภาษาใด ๆ จัดการข้อผิดพลาดเป็นสิ่งจำเป็น ประเภทข้อผิดพลาดคือ:
ข้อผิดพลาดไวยากรณ์มักจะเกิดจากส่วนประกอบของโปรแกรม (เช่นผู้ประกอบการแสดงออก) ที่เกิดจากการใช้งานที่ไม่เหมาะสม ตัวอย่างง่ายๆดังต่อไปนี้:
-- test.lua 文件 a == 2
รหัสข้างต้นจะถูกดำเนินการเป็นผลมาจาก:
lua: test.lua:2: syntax error near '=='
ในขณะที่คุณสามารถดูมีได้รับมากกว่าไวยากรณ์ผิดพลาดเป็น "=" ลงชื่อตามด้วยสอง "=" สัญญาณที่แตกต่างกัน A "=" คือการแสดงออกที่ได้รับมอบหมายสอง "=" คือการดำเนินการเปรียบเทียบ
อีกตัวอย่างหนึ่ง:
for a= 1,10 print(a) end
โปรแกรมดังกล่าวข้างต้นจะปรากฏข้อผิดพลาดต่อไปนี้:
lua: test2.lua:2: 'do' expected near 'print'
ข้อผิดพลาดไวยากรณ์ง่ายกว่าการทำงานที่ผิดพลาดของโปรแกรมเรียกใช้ข้อผิดพลาดไม่สามารถหาข้อผิดพลาดที่เฉพาะเจาะจงไวยากรณ์ผิดพลาดที่เราได้อย่างรวดเร็วสามารถแก้ไขเช่นตัวอย่างข้างต้นตราบใดที่เราทำในงบที่สามารถเพิ่ม:
for a= 1,10 do print(a) end
เรียกใช้โปรแกรมสามารถดำเนินการผิดพลาดเป็นเรื่องปกติ แต่มันออกจะมีข้อความผิดพลาด ตัวอย่างต่อไปนี้เนื่องจากข้อผิดพลาดในการป้อนพารามิเตอร์ข้อผิดพลาดการทำงานของโปรแกรม:
function add(a,b) return a+b end add(10)
เมื่อเรารวบรวมและเรียกใช้รหัสต่อไปนี้คอมไพเลอร์จะประสบความสำเร็จ แต่ในเวลาทำงานจะผลิตข้อผิดพลาดต่อไปนี้:
lua: test2.lua:2: attempt to perform arithmetic on local 'b' (a nil value) stack traceback: test2.lua:2: in function 'add' test2.lua:5: in main chunk [C]: ?
ข้อความต่อไปนี้เป็นข้อผิดพลาดที่เกิดเพราะโปรแกรมขาดพารามิเตอร์ข
เราสามารถใช้ฟังก์ชั่นที่สอง: ยืนยันและความผิดพลาดในการจัดการกับข้อผิดพลาด ตัวอย่างมีดังนี้
local function add(a,b) assert(type(a) == "number", "a 不是一个数字") assert(type(b) == "number", "b 不是一个数字") return a+b end add(10)
โปรแกรมดังกล่าวข้างต้นจะปรากฏข้อผิดพลาดต่อไปนี้:
lua: test.lua:3: b 不是一个数字 stack traceback: [C]: in function 'assert' test.lua:3: in local 'add' test.lua:6: in main chunk [C]: in ?
ตัวอย่างยืนยันการตรวจสอบครั้งแรกอาร์กิวเมนต์แรกถ้าไม่มีปัญหายืนยันไม่ทำอะไรเลย; อาร์กิวเมนต์ที่สองเป็นที่จะยืนยันข้อผิดพลาดมิฉะนั้นโยน
ไวยากรณ์:
error (message [, level])
: ยุติฟังก์ชั่นที่มีการดำเนินการและผลตอบแทนที่เนื้อหาของข้อความที่เป็นข้อผิดพลาด (ฟังก์ชันข้อผิดพลาดจะไม่กลับ)
โดยปกติแล้วข้อผิดพลาดจะได้รับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดไปที่ตำแหน่งหัว
พารามิเตอร์ระดับแสดงถึงตำแหน่งที่จะได้รับไม่ถูกต้อง:
จัดการข้อผิดพลาด Lua, คุณสามารถใช้ฟังก์ชั่น pcall (โทรป้องกัน) เพื่อตัดรหัสที่จะดำเนินการ
pcall รับฟังก์ชั่นและคุณต้องการที่จะผ่านพารามิเตอร์ของหลังและดำเนินการผล: มีข้อผิดพลาดไม่มีข้อผิดพลาดหรือค่าตอบแทนของจริงหรือเท็จ errorInfo
ไวยากรณ์เป็นดังนี้
if pcall(function_name, ….) then -- 没有错误 else -- 一些错误 end
ตัวอย่างง่ายๆ
> =pcall(function(i) print(i) end, 33) 33 true > =pcall(function(i) print(i) error('errorth') end, 33) 33 false stdin:1: errorth
> function f() return false,2 end > if f() then print '1' else print '0' end 0
pcall ในโหมด "การป้องกัน" เพื่อเรียกอาร์กิวเมนต์แรกจึงฟังก์ชั่นการจับภาพ pcall สามารถดำเนินการผิดพลาดใด ๆ
โดยปกติเมื่อมีข้อผิดพลาดเกิดขึ้นก็หวังว่าจะจบลงด้วยข้อมูลการแก้จุดบกพร่องมากขึ้นไม่เพียง แต่ข้อผิดพลาดที่เกิดขึ้น แต่ผลตอบแทนที่ pcall มันได้ทำลายส่วนหนึ่งของเนื้อหาของ Zhan โทร
Lua ให้ฟังก์ชันการ xpcall, xpcall รับพารามิเตอร์ที่สอง - การจัดการข้อผิดพลาดเมื่อมีข้อผิดพลาดเกิดขึ้น Lua จัดการข้อผิดพลาดจะถูกเรียกว่าก่อนที่จะเรียกการแสดง Zhan เพื่อดู (ผ่อนคลาย) แล้วคุณสามารถใช้ฟังก์ชั่นนี้ในห้องสมุดการแก้ปัญหา ที่จะได้รับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาด
ห้องสมุดการแก้ปัญหามีสองจัดการข้อผิดพลาดทั่วไป:xpcall ตัวอย่างที่ 2:
function myfunction () n = n/nil end function myerrorhandler( err ) print( "ERROR:", err ) end status = xpcall( myfunction, myerrorhandler ) print( status)
โปรแกรมดังกล่าวข้างต้นจะปรากฏข้อผิดพลาดต่อไปนี้:
ERROR: test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value) false