仅在文件存在时加载Lua模块,不存在则回退至{}
Lua 模块不存在时优雅回退到空表的正确实现
你原来的写法失效的核心原因是:Lua的require函数在找不到指定模块时会直接抛出运行时错误,而非返回nil,因此or {}这部分回退代码根本无法执行,导致重命名bar.lua后程序崩溃。
正确实现方式
使用Lua的pcall(保护调用)来包裹require,捕获模块加载失败的异常,从而实现优雅回退:
-- 执行require并捕获结果 local ok, module_result = pcall(require, "foo.bar") -- 加载成功则用模块返回值,失败则用空表 local baz = ok and module_result or {}
代码解释
pcall会安全执行传入的函数(此处为require):- 若模块存在且加载成功,返回
true和模块的返回值(即bar.lua里的表); - 若模块不存在或加载出错,返回
false和错误信息。
- 若模块存在且加载成功,返回
- 通过
ok and module_result or {}的逻辑判断,实现加载成功用模块内容,失败则回退到空表的需求。
完整示例
修改后的main.lua:
local ok, module_result = pcall(require, "foo.bar") local baz = ok and module_result or {} print(baz) -- 模块存在时输出:{ example = true } -- 模块不存在时输出:{}
内容的提问来源于stack exchange,提问作者sloppy
相关产品推荐
相关产品推荐

