lua的pcall

对于大多数应用而言,我们无须在Lua代码中做任何错误处理,应用程序本身会负责处理这类问题。
所有Lua语言的行为都是由应用程序的一次调用而触发的,这类调用通常是要求Lua语言执行一段代码。
如果执行中发生了错误,那么调用会返回一个错误代码,以便应用程序采取适当的行为来处理错误。
当独立解释器中发生错误时,主循环会打印错误信息,然后继续显示提示符,并等待执行指定的命令。
不过,如果要在Lua代码中处理错误,那么就应该使用函数pcall(protected call)来封装代码。

在Lua的cjson库中,pcall函数的原型是:

function pcall(f [, arg1, ···])


其中,`f` 是要执行的函数,`arg1, ···` 是可选的参数。
pcall函数会尝试执行函数 `f`,并捕获其中可能出现的错误,以防止整个程序崩溃。
如果执行成功,pcall会返回`true`,并将函数 `f` 的返回值一并返回;
如果执行过程中出现错误,pcall会返回`false`,并将错误信息作为第一个返回值返回。

需要注意的是,pcall函数只能捕获 Lua 中的错误,无法捕获底层的C函数调用错误。
如果 `f` 是一个 C 函数,发生的错误将会直接导致整个程序崩溃。

  1 --一个使用示例
  2 package.cpath = "cjson/?.so;" .. package.cpath
  3 local cjson = require("cjson")
  4 
  5 local function is_json(str)
  6     local success, result = pcall(cjson.decode, str)
  7     return success
  8 end
  9 
 10 local test_str1 = '{"name": "John", "age": 30}'
 11 local test_str2 = 'This is not a valid JSON string'
 12 
 13 local if_str1_json = is_json(test_str1)
 14 local if_str2_json = is_json(test_str2)
 15 
 16 print(if_str1_json)
 17 print(if_str2_json)
 18 
 19 if if_str1_json then
 20     print("test_str1 is a valid JSON")
 21 else
 22     print("test_str1 is not a valid JSON")
 23 end
 24 
 25 if if_str2_json then
 26     print("test_str2 is a valid JSON")
 27 else
 28     print("test_str2 is not a valid JSON")
 29 end

你可能感兴趣的:(lua,pcall,lua异常)