Lua 异常处理指令
Gaia 框架为 Lua 后端提供了完整的异常处理机制,支持错误捕获、异常传播和资源清理。
错误处理基础
pcall 函数
Lua 使用 pcall (protected call) 进行错误捕获:
lua
-- Gaia 代码
local success, result = pcall(function()
return risky_operation()
end)
if success then
print("Success: " .. result)
else
print("Error: " .. result)
endxpcall 函数
xpcall 允许指定错误处理函数:
lua
-- Gaia 代码
local function error_handler(err)
print("Error caught: " .. err)
return "handled"
end
local success, result = xpcall(function()
error("Something went wrong")
end, error_handler)异常指令集
TRY 指令
lua
-- Gaia 代码
TRY
-- 可能抛出异常的代码
risky_operation()
CATCH exception
-- 异常处理代码
handle_error(exception)
END_TRYTHROW 指令
lua
-- Gaia 代码
THROW "Custom error message"
THROW error_objectASSERT 指令
lua
-- Gaia 代码
ASSERT condition "Assertion failed"错误对象
创建错误对象
lua
-- Gaia 代码
local error_obj = {
message = "Custom error",
code = 500,
stack_trace = debug.traceback()
}错误类型
lua
-- Gaia 代码
local ErrorTypes = {
VALIDATION_ERROR = "ValidationError",
NETWORK_ERROR = "NetworkError",
DATABASE_ERROR = "DatabaseError"
}异常处理模式
包装模式
lua
-- Gaia 代码
local function safe_divide(a: number, b: number): (boolean, number|string)
if b == 0 then
return false, "Division by zero"
end
return true, a / b
end错误传播
lua
-- Gaia 代码
local function process_data(data: table): (boolean, table|string)
local success, validated = validate_data(data)
if not success then
return false, "Validation failed: " .. validated
end
local success, processed = transform_data(validated)
if not success then
return false, "Processing failed: " .. processed
end
return true, processed
end资源管理
使用 finally 模式
lua
-- Gaia 代码
local function with_resource(resource: any): (boolean, any)
local success, result = pcall(function()
-- 使用资源的操作
return process_resource(resource)
end)
-- 清理资源(finally 块)
cleanup_resource(resource)
return success, result
endRAII 模式
lua
-- Gaia 代码
local ResourceManager = {}
Resource.__index = Resource
function ResourceManager:new(resource: any)
local obj = {resource = resource}
setmetatable(obj, ResourceManager)
return obj
end
function ResourceManager:__gc()
if self.resource then
self.resource:cleanup()
end
end调试支持
堆栈跟踪
lua
-- Gaia 代码
local function get_stack_trace(): string
return debug.traceback()
end错误定位
lua
-- Gaia 代码
local function detailed_error(message: string): string
local info = debug.getinfo(2)
return string.format("Error at %s:%d: %s",
info.short_src, info.currentline, message)
end性能优化
错误处理性能
lua
-- Gaia 代码
-- 推荐:预先检查条件
if divisor ~= 0 then
result = dividend / divisor
end
-- 避免:依赖异常处理
local success, result = pcall(function()
return dividend / divisor
end)异常安全
lua
-- Gaia 代码
local function atomic_operation(): (boolean, any)
local backup = get_state()
local success, result = pcall(function()
return perform_operation()
end)
if not success then
restore_state(backup)
return false, result
end
return true, result
end最佳实践
错误处理策略
- 预防优于治疗: 预先检查条件,避免异常
- 具体错误信息: 提供详细的错误描述
- 错误分类: 使用错误类型进行分类处理
- 资源清理: 确保异常发生时资源得到清理
异常使用原则
- 异常情况: 只在真正异常的情况下使用异常
- 性能考虑: 异常处理有性能开销,避免在热路径中过度使用
- 错误传播: 合理传播错误,不要吞掉异常
- 日志记录: 记录异常信息,便于调试
代码示例
lua
-- Gaia 代码
local function robust_function(input: any): (boolean, any)
-- 参数验证
if not input then
return false, "Input is required"
end
-- 使用 pcall 保护关键操作
local success, result = pcall(function()
return process_input(input)
end)
if not success then
-- 记录错误并返回友好信息
log_error("Process failed", result)
return false, "Processing failed, please try again"
end
return true, result
end