From 76cf6dd1013e976c38e4513a5f278c04e66bda2a Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Mon, 11 Sep 2023 15:59:05 -0400 Subject: [PATCH] feat(error): change `Display for Error` to only print top error hyper's `Error` used to print the error source automatically, preferring to provide a better default for users who do not know about `Report`. But, to fit better with the wider ecosystem, this changes the format to only print the hyper `Error` itself, and not its source. Closes #2844 BREAKING CHANGE: The format no longer prints the error chain. Be sure to check if you are logging errors directly. The `Error::message()` method is removed, it is no longer needed. The `Error::into_cause()` method is removed. --- src/error.rs | 28 +++++++++++++--------------- tests/client.rs | 4 ---- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/error.rs b/src/error.rs index b07a22c409..02e8002922 100644 --- a/src/error.rs +++ b/src/error.rs @@ -8,6 +8,18 @@ pub type Result = std::result::Result; type Cause = Box; /// Represents errors that can occur handling HTTP streams. +/// +/// # Formatting +/// +/// The `Display` implementation of this type will only print the details of +/// this level of error, even though it may have been caused by another error +/// and contain that error in its source. To print all the relevant +/// information, including the source chain, using something like +/// `std::error::Report`, or equivalent 3rd party types. +/// +/// The contents of the formatted error message of this specific `Error` type +/// is unspecified. **You must not depend on it.** The wording and details may +/// change in any version, with the goal of improving error messages. pub struct Error { inner: Box, } @@ -173,11 +185,6 @@ impl Error { self.find_source::().is_some() } - /// Consumes the error, returning its cause. - pub fn into_cause(self) -> Option> { - self.inner.cause - } - pub(super) fn new(kind: Kind) -> Error { Error { inner: Box::new(ErrorImpl { kind, cause: None }), @@ -332,11 +339,6 @@ impl Error { } } - /// The error's standalone message, without the message from the source. - pub fn message(&self) -> impl fmt::Display + '_ { - self.description() - } - fn description(&self) -> &str { match self.inner.kind { Kind::Parse(Parse::Method) => "invalid HTTP method parsed", @@ -420,11 +422,7 @@ impl fmt::Debug for Error { impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - if let Some(ref cause) = self.inner.cause { - write!(f, "{}: {}", self.description(), cause) - } else { - f.write_str(self.description()) - } + f.write_str(self.description()) } } diff --git a/tests/client.rs b/tests/client.rs index 3d46c3fbfa..1d19f8ea1d 100644 --- a/tests/client.rs +++ b/tests/client.rs @@ -2318,10 +2318,6 @@ mod conn { let error = client.send_request(req).await.unwrap_err(); assert!(error.is_user()); - assert_eq!( - error.to_string(), - "dispatch task is gone: user code panicked" - ); } async fn drain_til_eof(mut sock: T) -> io::Result<()> {