018-Lua 错误处理

Lua 提供了灵活的错误处理机制,用于捕获和处理运行时错误,从而提高程序的健壮性。这些机制包括 错误抛出错误捕获堆栈跟踪,通过 errorpcallxpcall 等函数实现。

下面将详细介绍 Lua 错误处理的基本概念、语法、最佳实践以及实际案例。


1. 错误处理的核心机制

1.1 错误抛出

Lua 中可以使用 error 函数显式抛出错误。当调用 error 时,程序会终止当前执行,并将错误信息传递给调用者。

语法
error(message [, level])
  • message:要抛出的错误信息。
  • level:可选参数,用于指定错误回溯的层级(默认为 1,表示抛出错误的函数所在的调用栈)。
示例:抛出错误
local function divide(a, b)
    if b == 0 then
        error("Division by zero is not allowed!")
    end
    return a / b
end

print(divide(10, 2)) -- 输出:5
print(divide(10, 0)) -- 抛出错误:"Division by zero is not allowed!"

输出:

5
lua: example.lua:3: Division by zero is not allowed!
stack traceback:
    example.lua:3: in function 'divide'
    example.lua:7: in main chunk
    [C]: in ?

1.2 错误捕获

Lua 提供了两种捕获错误的方法:pcallxpcall

1.2.1 pcall

pcall 表示 protected call(受保护调用),可以在不终止程序的情况下捕获错误。

语法

pcall(function, ...)
  • 返回值:
    1. true:函数调用成功。
    2. false:函数调用失败,第 2 个返回值为错误信息。
示例:使用 pcall 捕获错误

local function divide(a, b)
    if b == 0 then
        error("Division by zero is not allowed!")
    end
    return a / b
end

local status, result = pcall(divide, 10, 2)
if status then
    print("Result:", result) -- 输出:Result: 5
else
    print("Error:", result) -- 不执行
end

local status, result = pcall(divide, 10, 0)
if status then
    print("Result:", result) -- 不执行
else
    print("Error:", result) -- 输出:Error: Division by zero is not allowed!
end

1.2.2 xpcall

xpcallpcall 的扩展版本,允许指定一个自定义的错误处理函数。

语法

xpcall(function, error_handler, ...)
  • function:被调用的函数。
  • error_handler:自定义错误处理函数,用于处理错误信息。
  • 返回值
    1. true:函数调用成功。
    2. false:函数调用失败,第 2 个返回值为错误处理函数返回的结果。
示例:使用 xpcall 捕获错误

local function error_handler(err)
    return "Custom Error: " .. err
end

local function divide(a, b)
    if b == 0 then
        error("Division by zero is not allowed!")
    end
    return a / b
end

local status, result = xpcall(function() return divide(10, 0) end, error_handler)
if status then
    print("Result:", result) -- 不执行
else
    print("Error:", result) -- 输出:Error: Cu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小宝哥Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值