# stage2: "Pop" error trace for break/return within catch · gitcafe/zig

[View on GitCafe](https://git.cafe/gitcafe/zig/commit/eda3eb1561ec9a68e692821d5de71d03e6f50d42)

Repository: [gitcafe/zig](https://git.cafe/gitcafe/zig)

Visibility: public

Requested revision: eda3eb1561ec9a68e692821d5de71d03e6f50d42

Requested commit: eda3eb1561ec9a68e692821d5de71d03e6f50d42

Commit: eda3eb1561ec9a68e692821d5de71d03e6f50d42

Tree: 5a3acd315089bfda58cf4366445ae8ca1916e5fd

Author: Cody Tapscott

Committer: Cody Tapscott

## Message

````
stage2: "Pop" error trace for break/return within catch

This implement trace "popping" for correctly handled errors within
`catch { ... }` and `else { ... }` blocks.

When breaking from these blocks with any non-error, we pop the error
trace frames corresponding to the operand. When breaking with an error,
we preserve the frames so that error traces "chain" together as usual.

```zig
fn foo(cond1: bool, cond2: bool) !void {
    bar() catch {
    	if (cond1) {
	    // If baz() result is a non-error, pop the error trace frames from bar()
	    // If baz() result is an error, leave the bar() frames on the error trace
            return baz();
	} else if (cond2) {
	    // If we break/return an error, then leave the error frames from bar() on the error trace
	    return error.Foo;
	}
    };

    // An error returned from here does not include bar()'s error frames in the trace
    return error.Bar;
}
```

Notice that if foo() does not return an error it, it leaves no extra
frames on the error trace.

This is piece (1/3) of https://github.com/ziglang/zig/issues/1923#issuecomment-1218495574

````

## Parents

- [5316a00a188955d60cc38d56def51b8605181225](https://git.cafe/gitcafe/zig/commit/5316a00a188955d60cc38d56def51b8605181225?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zig/tree/eda3eb1561ec9a68e692821d5de71d03e6f50d42?format=markdown)
