关于Lua的异常处理

226 views
Skip to first unread message

damacheng009

unread,
Jul 5, 2012, 10:46:48 PM7/5/12
to openresty
hello all:
    看下列代码:
 
片段1:
local status, err = pcall(function () a = "a" + 1 end)
print(status)
print(err)   -- 打印load.lua:1: attempt to perform arithmetic on a string value
 
片段2:
local status, err = xpcall(function () a = "a" + 1 end, function () print(debug.traceback()) end)
print(status)
print(err)   -- 打印nil
 
片段1打印出了出错原因
片段2打印了出错时的traceback,可片段2想得到片段1的出错原因,却获取不到,请问大家怎么得到出错原因呢,大家在用Lua嵌入openresty时对于处理异常有啥好心得呢?
 
 
 
2012-07-06

damacheng009

agentzh

unread,
Jul 6, 2012, 12:37:42 AM7/6/12
to open...@googlegroups.com
Hello!

2012/7/5 damacheng009 <damach...@gmail.com>:


> 片段2:
> local status, err = xpcall(function () a = "a" + 1 end, function ()
> print(debug.traceback()) end)
> print(status)
> print(err) -- 打印nil
>
> 片段1打印出了出错原因
> 片段2打印了出错时的traceback,可片段2想得到片段1的出错原因,却获取不到,请问大家怎么得到出错原因呢,

因为 xpcall 在第一个返回值之后,返回的是其第二个函数参数运行后的返回值,这与 pcall 是不同的。你的例子在 xpcall
的第二个参数函数中并未返回任何有意义的值,所以 xpcall 的第二个返回值自然是 nil. 你的例子改成下面这样,就符合你的需求了:

local status, err = xpcall(function () a = "a" + 1 end,

function (err) print(debug.traceback()) return err end)
print(status)
print(err)

更多细节可以参见 Lua 5.1 的官方文档中对 xpcall 函数的用法介绍:

http://www.lua.org/manual/5.1/manual.html#pdf-xpcall

Best regards,
-agentzh

Reply all
Reply to author
Forward
0 new messages