commit 1d041d3a10ec9187b7c4de6b4eb8a90926ea8d6c (tree)
parent 0931dda9a95e14b97a84e60aed424fd8bb5e1232
Author: Andrew Kelley <andrew@ziglang.org>
Date: Wed, 14 Sep 2022 19:26:28 -0400
Merge pull request #11664 from vincenzopalazzo/macros/docs
docs: add missed docs for some language feature like `defer` and `errdefer`
Diffstat:
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/doc/langref.html.in b/doc/langref.html.in
@@ -4862,14 +4862,41 @@ fn deferErrorExample(is_error: bool) !void {
print("encountered an error!\n", .{});
}
+ // inside a defer method the return statement
+ // is not allowed.
+ // The following lines produce the following
+ // error if uncomment
+ // ```
+ // defer.zig:73:9: error: cannot return from defer expression
+ // return error.DeferError;
+ // ```
+ //
+ //defer {
+ // return error.DeferError;
+ //}
+
if (is_error) {
return error.DeferError;
}
}
+// The errdefer keyword support also an alternative syntax to capture the
+// error generated in case of one error.
+//
+// This is useful when during the clean up after an error additional
+// message want to be printed.
+fn deferErrorCaptureExample() !void {
+ errdefer |err| {
+ std.debug.print("the error is {s}\n", .{@errorName(err)});
+ }
+
+ return error.DeferError;
+}
+
test "errdefer unwinding" {
deferErrorExample(false) catch {};
deferErrorExample(true) catch {};
+ deferErrorCaptureExample() catch {};
}
{#code_end#}
{#see_also|Errors#}
@@ -11930,7 +11957,7 @@ fn readU32Be() u32 {}
<pre>{#syntax#}errdefer{#endsyntax#}</pre>
</th>
<td>
- {#syntax#}errdefer{#endsyntax#} will execute an expression when control flow leaves the current block if the function returns an error.
+ {#syntax#}errdefer{#endsyntax#} will execute an expression when control flow leaves the current block if the function returns an error, the errdefer expression can capture the unwrapped value.
<ul>
<li>See also {#link|errdefer#}</li>
</ul>