在 xpcall 错误处理函数中捕获 LuaSQL 错误

我该如何将 LuaSQL 驱动程序的错误输出作为参数传递给 xpcall error 函数,就像 assert 一样?

例如,通过运行以下代码:

local conn =  assert (env:connect("demo_database",config.db.username,config.db.password,config.db.host))

我得到以下错误:

LuaSQL:连接数据库错误。MySQL:Access denied for user 'user_1'@'host1'(using password: YES)

但是,当我运行以下代码时:

local function myerrorhandler( err )
    local file = assert( io.open( "/tmp/testout.txt", "w" ) )
    file:write( err.." - error\n" )
    file:close()
end

local conn = xpcall (env:connect("demo_database",config.db.username,config.db.password,config.db.host), myerrorhandler)

在日志文件中收到的错误是:attempt to call a nil value - error

点赞
用户14274597
用户14274597

xpcall 期望第一个参数是一个函数,并且它会调用该函数并捕获其错误。你基本上正在执行 xpcall(func(), handler),即调用 func 而不是仅将其传递给 xpcall,类似于 pcall 期望第一个参数是一个函数。

你基本上想要将你的代码包装在一个函数中:

local conn = xpcall(function()
    return env:connect("demo_database", config.db.username, config.db.password, config.db.host)
end, myerrorhandler)
2021-08-05 18:15:28