Latest web development tutorials

Lua จัดการข้อผิดพลาด

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

การเขียนโปรแกรมภาษาใด ๆ จัดการข้อผิดพลาดเป็นสิ่งจำเป็น ประเภทข้อผิดพลาดคือ:

  • ไวยากรณ์ผิดพลาด
  • ข้อผิดพลาด Runtime

ไวยากรณ์ผิดพลาด

ข้อผิดพลาดไวยากรณ์มักจะเกิดจากส่วนประกอบของโปรแกรม (เช่นผู้ประกอบการแสดงออก) ที่เกิดจากการใช้งานที่ไม่เหมาะสม ตัวอย่างง่ายๆดังต่อไปนี้:

-- 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

ข้อผิดพลาด Runtime

เรียกใช้โปรแกรมสามารถดำเนินการผิดพลาดเป็นเรื่องปกติ แต่มันออกจะมีข้อความผิดพลาด ตัวอย่างต่อไปนี้เนื่องจากข้อผิดพลาดในการป้อนพารามิเตอร์ข้อผิดพลาดการทำงานของโปรแกรม:

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])

: ยุติฟังก์ชั่นที่มีการดำเนินการและผลตอบแทนที่เนื้อหาของข้อความที่เป็นข้อผิดพลาด (ฟังก์ชันข้อผิดพลาดจะไม่กลับ)

โดยปกติแล้วข้อผิดพลาดจะได้รับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดไปที่ตำแหน่งหัว

พารามิเตอร์ระดับแสดงถึงตำแหน่งที่จะได้รับไม่ถูกต้อง:

  • ระดับ = 1 [เริ่มต้น]: ข้อผิดพลาดในการโทร (ไฟล์ + หมายเลขบรรทัด)
  • ระดับ = 2: ฟังก์ชั่นที่เรียกฟังก์ชั่นที่ระบุข้อผิดพลาด
  • ระดับ = 0: ไม่ต้องเพิ่มสถานที่ผิดพลาด

pcall และ xpcall แก้ปัญหา

จัดการข้อผิดพลาด 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('error..') end, 33)
33
false        stdin:1: error..
> 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 เพื่อดู (ผ่อนคลาย) แล้วคุณสามารถใช้ฟังก์ชั่นนี้ในห้องสมุดการแก้ปัญหา ที่จะได้รับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาด

ห้องสมุดการแก้ปัญหามีสองจัดการข้อผิดพลาดทั่วไป:

  • debug.debug: Lua ให้พรอมต์ช่วยให้ผู้ใช้ในการแพร่กระจายด้วยเหตุผลผิด
  • debug.traceback: ตามที่โทร Zhan ที่จะสร้างข้อผิดพลาดขยาย
> = Xpcall (ฟังก์ชัน (i) การพิมพ์ (i) ข้อผิดพลาด (ข้อผิดพลาด .. ') End, ฟังก์ชั่น () พิมพ์ (debug.traceback ()) สิ้นสุด 33) 33 สแต็ค traceback: stdin: 1: ในการทำงาน [C]: ในฟังก์ชั่น 'ข้อผิดพลาด' stdin: 1: ในการทำงาน [C]: ในฟังก์ชั่น 'xpcall' stdin: 1: ในก้อนหลัก [C] :? ในศูนย์เท็จ

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