• 一些 Lua 的操作可能会引发错误。
      • 通过捕获错误可以继续流程,从而不用担心因错误导致的程序中断。
    • Lua 可以调用 error 函数(永远不会返回) 显式地引发错误
    • 可以使用 pcallxpcall 执行受保护地调用去捕获 Lua 程序中的错误。
      • pcall 函数在保护模式中调用给定函数。
        • 在运行函数时,当错误发生会终止函数执行并且控制会立即返回到 pcall 并返回一个状态码
    • 因为 Lua 是一个嵌入式扩展语言,Lua 的代码由主机程序里的 C 语言代码的调用并执行。
      • 当你独立使用 Lua 的时候, Lua 应用即主机程序。
      • 通常来说,这种调用是受保护的。
      • 编译或执行 Lua 模块的时候发生不受保护的错误,控制权将交还给主机
      • 主机会适当地进行操作,例如打印错误信息。
    • 当错误产生的时候,错误对象与错误信息一起被 Lua 程序传递。
      • Lua 本身只会产生String类型的错误对象,但是程序可以产生任何值代表的错误对象。
      • 由 Lua 程序 或 主机来处理这些错误对象。
      • 由于历史原因,错误对象通常被称为错误消息,即使这些对象并不是String类型的。
    • 当使用xpcall或 C 语言中的lua_pcall时,可以给出一个消息处理程序,以便在错误出现时调用。
    • 这个函数与原始错误对象一起调用,并返回一个新的错误对象。
      • 在错误展开堆之前被调用,这样可以收集更多的错误信息
        • 例如可以检查栈并创建栈回溯
    • 消息处理程序受保护的调用
      • 在消息处理程序中的错误会再次调用消息处理程序
      • 如果这个循环持续太久,Lua 会打破这个循环并返回适当的消息。
    • 只有在发生常规运行时错误才会调用消息处理程序。
    • 内存分配错误,运行finalizers或其他消息处理程序不会调用当前消息处理程序。
    • Lua 也提供了一个警告系统warn
      • 不像错误,警告不会干涉程序的运行
      • 他们通常只会给用户返回信息,尽管这种操作可以在 C 语言中被修改lua_setwarnf