-- 打印错误信息 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 " .. 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 ---------------------------------------- TRACKBACK ---------------------------------------- >Exit code: 0
xpcall (f, err)
This function is similar to
pcall
,except that you can set a new error handler.
xpcall
calls functionf
in protected mode,usingerr
as the error handler.Any error insidef
is not propagated;instead,xpcall
catches the error,calls theerr
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 fromerr
.