Skip to content
Open
Changes from all commits
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
50 changes: 50 additions & 0 deletions library/core/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,56 @@ pub trait Error: Debug + Display {
/// assert!(request_ref::<MyLittleTeaPot>(dyn_error).is_none());
/// }
/// ```
///
/// # Delegating Impls
///
/// <div class="warning">
///
/// **Warning**: We recommend implementors avoid delegating implementations of `provide` to
/// source error implementations.
///
/// </div>
///
/// This method should expose context from the current piece of the source chain only, not from
/// sources that are exposed in the chain of sources. Delegating `provide` implementations cause
/// the same context to be provided by multiple errors in the chain of sources which can cause
/// unintended duplication of information in error reports or require heuristics to deduplicate.
///
/// In other words, the following implementation pattern for `provide` is discouraged and should
/// not be used for [`Error`] types exposed in public APIs to third parties.
///
/// ```rust
/// # #![feature(error_generic_member_access)]
/// # use core::fmt;
/// # use core::error::Request;
/// # #[derive(Debug)]
/// struct MyError {
/// source: Error,
/// }
/// # #[derive(Debug)]
/// # struct Error;
/// # impl fmt::Display for Error {
/// # fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
/// # write!(f, "Example Source Error")
/// # }
/// # }
/// # impl fmt::Display for MyError {
/// # fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
/// # write!(f, "Example Error")
/// # }
/// # }
/// # impl std::error::Error for Error { }
///
/// impl std::error::Error for MyError {
/// fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
/// Some(&self.source)
/// }
///
/// fn provide<'a>(&'a self, request: &mut Request<'a>) {
/// self.source.provide(request) // <--- Discouraged
/// }
/// }
/// ```
#[unstable(feature = "error_generic_member_access", issue = "99301")]
#[allow(unused_variables)]
fn provide<'a>(&'a self, request: &mut Request<'a>) {}
Expand Down
Loading