assert函数

如果assert函数第一个参数检测到异常,会输出第二个参数定义的错误信息,以及对应的错误信息

  1. -- 执行
  2. a = 1
  3. assert(type(a) == "string", "变量a不是一个字符串")
  4. -- 返回
  5. lua: index.lua:2: 变量a不是一个字符串
  6. stack traceback:
  7. [C]: in function 'assert'
  8. index.lua:2: in main chunk
  9. [C]: in ?

error函数

功能:终止正在执行的函数,并返回message的内容作为错误信息
语法格式
error(message[, level])
level=1:默认,调用error的位置(文件+行号)
level=2:指出调用error的函数
level=0:不添加错误位置信息

pcall

pcall用来包装要执行的代码,如果存在异常,不会直接被抛出,而是作为返回值的返回

示例抛出异常:

  1. function test()
  2. error("我抛出了一个异常")
  3. end
  4. result, err = pcall(test)
  5. print(result)
  6. print(err)
  7. -- 返回
  8. $ lua index.lua
  9. false
  10. index.lua:2: 我抛出了一个异常

示例正常代码:

  1. function test(a, b)
  2. return a, b
  3. end
  4. result, var1, var2 = pcall(test, 1, 2)
  5. print(result)
  6. print(var1)
  7. print(var2)
  8. -- 返回
  9. $ lua index.lua
  10. true
  11. 1
  12. 2

xpcall和debug

xpcall接收两个参数,第一个参数与pcall函数的一样,第二个参数用于接收一个异常处理函数,后续参数用于给第一个函数传参。
debug.debug:提供一个Lua提示符,让用户来检查错误
debug.traceback():根据调用栈来构建一个扩展的错误消息

异常代码:

  1. function test()
  2. error("我是异常信息")
  3. end
  4. function handleError()
  5. print("我是异常处理函数")
  6. print("Error:" .. debug.traceback())
  7. end
  8. result = xpcall(test, handleError)
  9. print(result)
  10. -- 返回
  11. $ lua index.lua
  12. 我是异常处理函数
  13. Errorstack traceback:
  14. index.lua:6: in function 'handleError'
  15. [C]: in function 'error'
  16. index.lua:2: in function 'test'
  17. [C]: in function 'xpcall'
  18. index.lua:8: in main chunk
  19. [C]: in ?
  20. false

正常代码:

  1. function test(a, b)
  2. return a, b
  3. end
  4. function handleError()
  5. print("我是异常处理函数")
  6. print("Error:" .. debug.traceback())
  7. end
  8. result, arr1, arr2 = xpcall(test, handleError, 1, 2)
  9. print(result)
  10. print(arr1)
  11. print(arr2)
  12. -- 返回
  13. $ lua index.lua
  14. true
  15. 1
  16. 2