last_error
简介
参考 windows 的 last error 设置, 将错误信息保存到 协程的 local_user_value 中, 方便在协程中获取错误信息, 从而将底层的错误信息暴露给上层
Last Error 模块使用说明文档
概述
last_error
模块是一个专为 GameScript 语言设计的错误处理模块,参考了 Windows 的 GetLastError() 机制。该模块将错误信息保存到协程的本地用户值(local_user_value)中,使得底层的错误信息能够方便地暴露给上层调用者。
主要功能
1. 错误处理
- 设置错误信息:支持格式化的错误信息设置
- 获取错误信息:支持获取纯文本错误信息或带堆栈的错误对象
- 一次性获取:错误信息获取后自动清理,避免重复处理
2. 警告处理
- 设置警告信息:支持格式化的警告信息设置
- 获取警告信息:支持获取纯文本警告信息或带堆栈的警告对象
- 独立于错误:警告和错误信息独立存储和处理
3. 堆栈跟踪
- 自动堆栈收集:自动收集调用堆栈信息
- 精确定位:准确定位错误发生的位置
- 调用链追踪:提供完整的函数调用链信息
4. 配置管理
- 输出控制:控制错误和警告是否输出到控制台
- 严格模式:防止错误信息被覆盖而未处理
- 灵活配置:支持运行时动态调整配置
优缺点分析
优点
-
简化错误处理
- 统一的错误处理机制,避免复杂的异常传递
- 类似于 Windows GetLastError() 的熟悉模式
- 支持格式化错误信息,便于调试
-
自动堆栈跟踪
- 自动收集调用堆栈信息
- 精确定位错误发生位置
- 便于调试和问题诊断
-
灵活配置
- 可控制错误和警告的输出
- 支持严格模式防止错误丢失
- 运行时动态调整配置
-
协程支持
- 基于协程的本地存储, 不需要关心错误的消息的回收问题
- 支持多协程并发执行
- 错误信息隔离,避免相互影响
-
轻量级设计
- 简单易用的 API
- 最小化性能开销
- 不依赖复杂的异常机制
使用场景
1. 文件操作错误处理
bool read_config_file(string filename)
{
// 模拟文件读取
if (!file_exists(filename)) {
last_error.set_error("配置文件不存在: %s", filename);
return false;
}
if (!has_read_permission(filename)) {
last_error.set_error("没有读取权限: %s", filename);
return false;
}
return true;
}
2. 网络连接错误处理
bool connect_to_server(string host, int port)
{
// 模拟网络连接
if (!network_available()) {
last_error.set_error("网络不可用");
return false;
}
if (!can_reach_host(host, port)) {
last_error.set_error("无法连接到服务器 %s:%d", host, port);
return false;
}
return true;
}