DevCN
菜单
全部文章快讯开发科技深度热点

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。需要单独报告负数时,应改用有符号解析并调整错误分类。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。