-- 列印錯誤資訊
local function __TRACKBACK__(errmsg)
local track_text = debug.traceback(tostring(errmsg), 6);
print("---------------------------------------- TRACKBACK ----------------------------------------");
print(track_text, "LUA ERROR");
print("---------------------------------------- TRACKBACK ----------------------------------------");
local exception_text = "LUA EXCEPTION\n" .. track_text;
return false;
end
--[[ 嘗試調一個function 這個function可以帶可變參數
如果被調用的函數有異常 傳回false,退出此方法繼續執行其他代碼并列印出異常資訊;]]
function trycall(func, ...)
local args = { ... };
return xpcall(function() func(unpack(args)) end, __TRACKBACK__);
end
--測試代碼:
trycall(function(param)
print("message "..param)
print("message "..nil)
end, "test trycall")
##輸出結果如下:
>lua -e "io.stdout:setvbuf 'no'" "itertor_test.lua"
message test trycall
---------------------------------------- TRACKBACK ----------------------------------------
itertor_test.lua:45: attempt to concatenate a nil value
stack traceback:
itertor_test.lua:43: in main chunk
[C]: ? LUA ERROR
>Exit code: 0
xpcall (f, err)
This function is similar to
pcall
,except that you can set a new error handler.
xpcall
calls function
f
in protected mode,using
err
as the error handler.Any error inside
f
is not propagated;instead,
xpcall
catches the error,calls the
err
function with the original error object,and returns a status code.Its first result is the status code (a boolean),which is true if the call succeeds without errors.In this case,
xpcall
also returns all results from the call,after this first result.In case of any error,
xpcall
returns false plus the result from
err
.
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuAjMjhTYxIWOidjM1YjNhljMhF2YxQWM5MWM5U2Y3EzNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)