Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarify catchless try in explainer #168

Merged
merged 5 commits into from
Jun 29, 2021
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 25 additions & 9 deletions proposals/exception-handling/Exceptions.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ A try-catch block contains zero or more `catch` blocks and zero or one
`catch_all` block. All `catch` blocks must precede the `catch_all` block, if
any. The `catch`/`catch_all` instructions (within the try construct) are called
the _catching_ instructions. There may not be any `catch` or `catch_all` blocks
after a `try`, in which case the whole `try` block is effectively a regular
block.
after a `try`, in which case the `try` block does not catch any exceptions and
rethrows them.
aheejin marked this conversation as resolved.
Show resolved Hide resolved

The _body_ of the try block is the list of instructions before the first
catching instruction. The _body_ of each catch block is the sequence of
Expand Down Expand Up @@ -258,6 +258,18 @@ end
The `rethrow` here references `try $l2`, but the `rethrow` is not within its
`catch` block.

Also, targetting a label of `catch`-less `try` or `try`-`delegate` is also a
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still don't see the relevance of the "catch-less" here, I think it's misleading: the example is a validation failure regardless of whether you add a catch clause or not. Both examples are invalid simply because rethrow does not reference a catch-block, no other reason.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess the whole added paragraph here about rethrow is not really meaningful and also misleading as you suggested. This PR's goal was to clarify about catchless try and its relationship w/ delegate, so I'll delete this whole paragraph and example.

validation failure, because `rethrow` is not within a `catch` or `catch_all`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This part is confusing as well: even if there was a surrounding catch somewhere it would still be invalid. Whether a catch exists is irrelevant, it only matters whether the rethrow references a catch.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deleted.

```
try $l1
rethrow $l1 ;; validation failure!
delegate

try $l2
rethrow $l2 ;; validation failure!
end
```

### Try-delegate blocks

Try blocks can also be used with the `delegate` instruction. A try-delegate
Expand All @@ -271,9 +283,8 @@ delegate label

The `delegate` clause does not have an associated body, so try-delegate blocks
don't have an `end` instruction at the end. The `delegate` instruction takes a
label defined by a construct in which they are enclosed, and delegates exception
handling to a catch block specified by the label. For example, consider this
code:
try label and delegates exception handling to a `catch`/`catch_all`/`delegate`
specified by the `try` label. For example, consider this code:

```
try $l1
Expand All @@ -296,17 +307,22 @@ correspond to a `try` instruction, it is a validation failure.
Note that the example below is a validation failure:
```
try $l1
catch 1
catch
try
call $foo
delegate $l1 ;; (= delegate 0)
catch_all
...
end
```
Here `delegate` is trying to delegate to `catch 1`, which exists before the
`delegate`. The `delegate` instruction can only delegate to `catch`/`catch_all`
blocks in a `try` or to another `delegate` below the `delegate` itself.
Here `delegate` is trying to delegate to `catch`, which exists before the
`delegate`. The `delegate` instruction can only target `try` label whose
catching instructions (`catch`/`catch_all`/`delegate`) come after the
`delegate` instruction.

`delegate` can also target `catch`-less `try`, in which case the effect is the
same as the `try` has catches but none of the catches are able to handle the
aheejin marked this conversation as resolved.
Show resolved Hide resolved
exception.

### JS API

Expand Down