[Unity热更新]lua基础(五)

十一.错误处理

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


对table中不存在的key进行操作是可以的,而上面所说的__index,__newindex,rawget,rawset都是针对类来说的,这里setmetatable就可以看作表和类的一个区分了


你可能感兴趣的:(lua)