50 lines
1.2 KiB
Zig
50 lines
1.2 KiB
Zig
|
//
|
||
|
// Let's revisit the very first error exercise. This time, we're going to
|
||
|
// look at a special error-handling type of the "if" statement.
|
||
|
//
|
||
|
// if (foo) |value| {
|
||
|
//
|
||
|
// // foo was NOT an error; value is the non-error value of foo
|
||
|
//
|
||
|
// } else |err| {
|
||
|
//
|
||
|
// // foo WAS an error; err is the error value of foo
|
||
|
//
|
||
|
// }
|
||
|
//
|
||
|
// We'll take it even further and use a switch statement to handle
|
||
|
// the error types.
|
||
|
//
|
||
|
const MyNumberError = error{
|
||
|
TooBig,
|
||
|
TooSmall,
|
||
|
};
|
||
|
|
||
|
const std = @import("std");
|
||
|
|
||
|
pub fn main() void {
|
||
|
var nums = [_]u8{2,3,4,5,6};
|
||
|
|
||
|
for (nums) |num| {
|
||
|
std.debug.print("{}", .{num});
|
||
|
|
||
|
var n = numberMaybeFail(num);
|
||
|
if (n) |value| {
|
||
|
std.debug.print("=4. ", .{});
|
||
|
} else |err| switch (err) {
|
||
|
MyNumberError.TooBig => std.debug.print(">4. ", .{}),
|
||
|
// Please add a match for TooSmall here and have it print: "<4. "
|
||
|
}
|
||
|
}
|
||
|
|
||
|
std.debug.print("\n", .{});
|
||
|
}
|
||
|
|
||
|
// This time we'll have numberMaybeFail() return an error union rather
|
||
|
// than a straight error.
|
||
|
fn numberMaybeFail(n: u8) MyNumberError!u8 {
|
||
|
if(n > 4) return MyNumberError.TooBig;
|
||
|
if(n < 4) return MyNumberError.TooSmall;
|
||
|
return n;
|
||
|
}
|