aboutsummaryrefslogtreecommitdiff
path: root/29_errdefer.zig
diff options
context:
space:
mode:
Diffstat (limited to '29_errdefer.zig')
-rw-r--r--29_errdefer.zig60
1 files changed, 0 insertions, 60 deletions
diff --git a/29_errdefer.zig b/29_errdefer.zig
deleted file mode 100644
index cd2158d..0000000
--- a/29_errdefer.zig
+++ /dev/null
@@ -1,60 +0,0 @@
-//
-// Another common problem is a block of code that could exit in multiple
-// places due to an error - but that needs to run do something before it
-// exits (typically to clean up after itself).
-//
-// An "errdefer" is a defer that only runs if the block exits with an error:
-//
-// {
-// errdefer cleanup();
-// try canFail();
-// }
-//
-// The cleanup() function is called ONLY if the "try" statement returns an
-// error produced by canFail().
-//
-const std = @import("std");
-
-//
-var counter: u32 = 0;
-
-const MyErr = error{ GetFail, IncFail };
-
-pub fn main() void {
- // We simply quit the entire program if we fail to get a number:
- var a: u32 = makeNumber() catch return;
- var b: u32 = makeNumber() catch return;
-
- std.debug.print("Numbers: {}, {}\n", .{a,b});
-}
-
-fn makeNumber() MyErr!u32 {
- std.debug.print("Getting number...", .{});
-
- // Please make the "failed" message print ONLY if the makeNumber()
- // function exits with an error:
- std.debug.print("failed!\n", .{});
-
- var num = try getNumber(); // <-- This could fail!
-
- num = try increaseNumber(num); // <-- This could ALSO fail!
-
- std.debug.print("got {}. ", .{num});
-
- return num;
-}
-
-fn getNumber() MyErr!u32 {
- // I _could_ fail...but I don't!
- return 4;
-}
-
-fn increaseNumber(n: u32) MyErr!u32 {
- // I fail after the first time you run me!
- if (counter > 0) return MyErr.IncFail;
-
- // Sneaky, weird global stuff.
- counter += 1;
-
- return n + 1;
-}