十一.错误处理
1.assert(发生错误时会中断程序)
--如果第一个参数为false,则输出第二个参数(即错误信息) --assert(1 < 0, "a error!!")--发生错误,错误信息为a error!! --如果第一个参数为true,则输出true和错误信息 local a,b = assert(1 > 0,"错误信息!!") print(a);--true print(b);--错误信息!!
2.pcall & xpcall(发生错误时不会中断程序)
--pcall,即protected call,作用类似与try catch function A(i) print(i); end function B(i) print(i); error("a error!!"); end --pcall,第一个是函数,然后是该函数的参数 --true表示执行后没错误,否则有错误 print(pcall(A,33));--33 true print(pcall(B,34));--34 false ------------------------------------------ print("-----------"); function C() print("进行错误处理"); end --xpcall,第一个是函数,然后是错误处理函数 xpcall(A,C);--nil xpcall(B,C);--nil 进行错误处理
十二.rawget & rawset
--rawget(table,key),作用是可以绕过__index --rawset(table,key,value),作用是可以绕过__newindex Window = {x = 0, y = 0, width = 100, height = 100} setmetatable(Window, Window); --对不存在的key进行获取时,就会触发__index Window.__index = function (t, k) return 1000; end --对不存在的key进行赋值时,就会触发__newindex Window.__newindex = function (t, k, v) print("no!") end ----rawget print(Window.a);--1000,因为使用了__index print(rawget(Window, a));--nil --rawset Window.b = 1;--no! print(Window.b);--1000 rawset(Window, "b", 500); print(Window.b);--500
Window.__newindex = function (t, k, v) rawset(Window, k, v); end而Window.__newindex = function (t, k, v) Window.k = v; end 这种写法是会报错的
看到这里,你或许会有疑惑,因为:
Window = {x = 0, y = 0, width = 100, height = 100} print(Window.a);--nil Window.b = 50 print(Window.b);--50