Skip to content

Display implementation for Error is unergonomic #27

@netvl

Description

@netvl

I found that there is no simple way to get a detailed message of an error without direct matching on Error variants, or without using Debug, because the Display impl for Error ignores the message:

impl fmt::Display for Error { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { write!(fmt, "HTTP/2 Error: {}", self.description()) } } impl StdError for Error { fn description(&self) -> &str { match *self { ... Error::Other(_) => "An unknown error", } } .... }

This interferes with generic error handling using libraries like failure - you cannot easily present a generic error to the user if it contains httpbis::error::Error. For example, suppose I have code like this (using rust-grpc):

fn start_server(config: Config) -> Result<(), failure::Error> { let mut server_builder = grpc::ServerBuilder::new_plain(); server_builder.http.set_addr(&config.address).context("Failed to set address")?; ... }

set_addr returns httpbis::error::Error, and it may fail if e.g. hostname in the address resolves to many addresses. If I use this code and I try to print the error chain when the address is incorrect, I get this:

% ./target/debug/iprlist server [E] [iprlist] Failed to set address [E] [iprlist] HTTP/2 Error: An unknown error 

which is completely opaque and user-unfriendly. And there is no simple way to show a more detailed error message, because the httpbis error is wrapped into failure::Context and failure::Error, and it would require downcasting and matching on all httpbis::error::Error enum variants to get a proper error message. Moreover, as far as I can see, this is not limited to the Error::Other variant - variants like Error::IoError are also displayed without any details.

In my opinion, the Display impl should display the underlying error, if there is any, instead of forwarding to description().

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions