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

Establish a new error handling project group #2965

Merged
merged 7 commits into from
Sep 18, 2020
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
7 changes: 7 additions & 0 deletions text/0000-project-error-handling.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ Here is a tenative starting point, subject to change:
- What is the consensus on handling `dyn Error`s? Should it be encouraged or discouraged? Should we look into making `Box<dyn Error...>` implement `Error`?


### Identify pain points in error handling today

- Backtrace capture is expensive, but without one it can be difficult to pinpoint the origin of errors
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
- Backtrace capture is expensive, but without one it can be difficult to pinpoint the origin of errors
- Backtrace capture is expensive, but without it can be difficult to pinpoint the origin of errors

Copy link
Member

Choose a reason for hiding this comment

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

I generally disagree with the universal applicability of this point as well; this is a key point of SNAFU — producing a semantic backtrace via the error types.

Copy link
Member Author

Choose a reason for hiding this comment

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

Assuming I understand what you mean, I think that the semantic backtraces via SNAFU can definitely help here but I don't think they're a universal solution. It still fairly easy to misuse. For example, if a developer introduces a higher level snafu error to handle an io::Error, but then uses this type liberally throughout the code. Unless you carefully create one variant per source location the origin of errors can still be lost.

Here's an example of this kind of thing going wrong via thiserror. ZcashFoundation/zebra#758

- unwrap on errors without first converting to a reporting type will often discard relevant information
yaahc marked this conversation as resolved.
Show resolved Hide resolved
- errors printing from main have to assume a prefixed `Error: `, sub par control of output format when printing during termination.
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
- errors printing from main have to assume a prefixed `Error: `, sub par control of output format when printing during termination.
- errors printed from `main` have to assume a prefixed `Error: `, sub-par control of output format when printing during termination.

Copy link
Member

Choose a reason for hiding this comment

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

I don't know what "have to assume a prefixed Error: " means.

Copy link
Member Author

@yaahc yaahc Jul 28, 2020

Choose a reason for hiding this comment

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

I'm referring to this default in std's impl of Termination for Result https://doc.rust-lang.org/stable/src/std/process.rs.html#1690-1696, right now there's no way to signal to Debug types that they're being formatted as part of Termination or not. @dtolnay has suggested adding an is_termination flag to Debug. I'm also interested in the possibility of a 3rd std::fmt trait called std::fmt::Report to handle this and reporting in panic hooks, leveraging specialization for backwards compatibility.

- Error trait only exposes 3 forms of context, can only represent singly linked lists for chains of errors
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
- Error trait only exposes 3 forms of context, can only represent singly linked lists for chains of errors
- The `Error` trait only exposes three forms of context, can only represent singly-linked lists for chains of errors

Copy link
Member

Choose a reason for hiding this comment

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

It's unclear what the pain points are here.

  • Is three too many or not enough?
  • Why is a singly-linked list painful?

Copy link
Member Author

@yaahc yaahc Jul 28, 2020

Choose a reason for hiding this comment

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

3 is not enough, I'd like to be able to return SpanTraces, std::panic::Location, and other such types via the error trait, this is a reference to the generic member access RFC.

Singly linked lists can be painful for parsers for example, where you encounter multiple errors at once, and they're all the source for a single higher level error, so your chain of errors looks a little more like a tree. This is also addressed by the generic member access proposal where you could access a dyn Iter<Item=&(dyn Error + 'static)>.


### Communicate current best practices

- Document the consensus.
Expand Down