• 关于xpcall函数的解释


    首先放一下官网的解释:

    http://www.lua.org/pil/8.5.html

    通常,当一个错误发生的时候,我们想要更多的debug信息当这个错误运行的时候,至少,我们想要一个堆栈信息,展示完整的指向错误的堆栈调用。当pcall返回的时候,它销毁了一部分函数的调用过程。为了解决这个问题,lua提供了xpcall函数。当这个函数被调用的时候,错误处理函数作为第二个参数。当错误发生的时候,lua在出栈之前会调用这个error处理函数,有两个错误处理函数,debug.debug和debug.traceback函数,当error发生的时候,debug.debug给你一个lua提示。而如果调用debug.traceback的时候,建立了可以追溯函数调用错误信息。后者具有独立解释构建错误的功能。

     1 function myfunction(n)
     2   n = n / 11
     3 end
     4 
     5 function myerrorhandler(err) 
     6   print("ERROR:", err)
     7 end
     8 
     9 
    10 status = xpcall(myfunction, myerrorhandler, 3, 4, 5)
    11 print(status)

    返回的结果是true

     1 function myfunction(n)
     2   n = n / nil 
     3 end
     4 
     5 function myerrorhandler(err) 
     6   print("ERROR:", err)
     7 end
     8 
     9 
    10 status = xpcall(myfunction, myerrorhandler, 3, 4, 5)
    11 print(status)

    返回的结果是:

    ERROR:    test.lua:3: attempt to perform arithmetic on a nil value
    false

    再就是关于调用非本文件的函数的时候,xpcall的参数定义也会发生相应的变化

    -- test1.lua
    test1 = {} function test1:Func(n) print("This is test1.lua, the n is =", n) end test1:Func(n) -- Func(2) return test1
    -- test.lua
    require
    "test1" function myfunction(n) n = n / 2 print("the n is", n) end function myerrorhandler(err) print("ERROR:", err) end status = xpcall(test1.Func, myerrorhandler, test1, 4) print(status)

    如果将xpcall函数中的test1去除,n将都会变成nul

  • 相关阅读:
    ES 内存深度解析
    Spring Cache介绍和使用
    mysql 索引及索引创建原则
    mysql中四种存储引擎的区别和选择
    Java中数组、List、Set互相转换
    COGS 1151 活动安排
    洛谷P1650赛马与codevs 2181 田忌赛马
    5月3日济南清北学堂随堂测试题目
    codevs 1206 保留两位小数
    codevs 1203 判断浮点数是否相等
  • 原文地址:https://www.cnblogs.com/letlifestop/p/13152646.html
Copyright © 2020-2023  润新知