Zig 错误联合:解析分钟数并分别处理格式和范围
使用标准整数解析与错误联合返回值,把解析失败映射成格式错误,再检查业务范围并通过 catch 逐条报告。
本节目标
使用标准整数解析与错误联合返回值,把解析失败映射成格式错误,再检查业务范围并通过 catch 逐条报告。
环境与运行方法
使用 Zig 0.16 工具链,保存为 lesson.zig,执行 zig build-exe lesson.zig -femit-bin=lesson,再运行 ./lesson。示例用 std.debug.print 输出到标准错误流,不能只检查标准输出。
核心思路
!u32 表示成功整数或错误。标准解析器可能返回不同解析错误,本例将它们统一映射为 InvalidFormat,业务超过 1440 则返回 OutOfRange。
完整示例
const std = @import("std");
fn minutes(text: []const u8) !u32 {
const value = std.fmt.parseInt(u32, text, 10) catch return error.InvalidFormat;
if (value > 1440) return error.OutOfRange;
return value;
}
pub fn main() void {
const inputs = [_][]const u8{ "30", "bad", "1441", "0" };
for (inputs) |text| {
const value = minutes(text) catch |err| {
std.debug.print("error={s}\n", .{@errorName(err)});
continue;
};
std.debug.print("ok={d}\n", .{value});
}
}预期输出
ok=30
error=InvalidFormat
error=OutOfRange
ok=0逐步理解
解析 catch 在函数内转换错误类别,调用处 catch 负责展示并继续处理下一条。continue 只结束当前循环,因此坏记录不会阻止后续的零分钟输入。
parseInt 的格式接受规则与严格数字字符协议并非完全相同,如果输入只允许某种十进制写法,应在解析前补充字符检查。错误名称适合诊断,产品展示文案可以独立设计,不必直接暴露内部名称。
常见问题与边界
- catch 后不能误用没有成功产生的值。
- 无符号类型不代替业务上限检查。
- std.debug.print 写入标准错误流,不意味着程序运行失败。
动手练习
增加 "1440" 与 "-1",预测分支。
参考答案
1440 成功;负数不能解析成 u32,映射为 InvalidFormat。需要单独报告负数时,应改用有符号解析并调整错误分类。
文章回复
0 条公开回复