about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorWithout Boats <boats@mozilla.com>2018-08-20 20:18:29 +0200
committerWithout Boats <boats@mozilla.com>2018-08-20 20:18:29 +0200
commitca258c5d1fa13523c40ff8b2f46fa33c79110579 (patch)
treebee6193f071ca9eb17e2666ac6dca71a4627c53f /src/libstd
parentbf1e461173e3936e4014cc951dfbdd7d9ec9190b (diff)
downloadrust-ca258c5d1fa13523c40ff8b2f46fa33c79110579.tar.gz
rust-ca258c5d1fa13523c40ff8b2f46fa33c79110579.zip
Add Error::source method per RFC 2504.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/error.rs67
1 files changed, 66 insertions, 1 deletions
diff --git a/src/libstd/error.rs b/src/libstd/error.rs
index 29534696abc..af5a0571c88 100644
--- a/src/libstd/error.rs
+++ b/src/libstd/error.rs
@@ -138,7 +138,72 @@ pub trait Error: Debug + Display {
     /// }
     /// ```
     #[stable(feature = "rust1", since = "1.0.0")]
-    fn cause(&self) -> Option<&dyn Error> { None }
+    #[rustc_deprecated(since = "1.33.0", reason = "replaced by Error::source, which can support \
+                                                   downcasting")]
+    fn cause(&self) -> Option<&dyn Error> {
+        self.source()
+    }
+
+    /// The lower-level source of this error, if any.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::error::Error;
+    /// use std::fmt;
+    ///
+    /// #[derive(Debug)]
+    /// struct SuperError {
+    ///     side: SuperErrorSideKick,
+    /// }
+    ///
+    /// impl fmt::Display for SuperError {
+    ///     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+    ///         write!(f, "SuperError is here!")
+    ///     }
+    /// }
+    ///
+    /// impl Error for SuperError {
+    ///     fn description(&self) -> &str {
+    ///         "I'm the superhero of errors"
+    ///     }
+    ///
+    ///     fn source(&self) -> Option<&dyn (Error + 'static)> {
+    ///         Some(&self.side)
+    ///     }
+    /// }
+    ///
+    /// #[derive(Debug)]
+    /// struct SuperErrorSideKick;
+    ///
+    /// impl fmt::Display for SuperErrorSideKick {
+    ///     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+    ///         write!(f, "SuperErrorSideKick is here!")
+    ///     }
+    /// }
+    ///
+    /// impl Error for SuperErrorSideKick {
+    ///     fn description(&self) -> &str {
+    ///         "I'm SuperError side kick"
+    ///     }
+    /// }
+    ///
+    /// fn get_super_error() -> Result<(), SuperError> {
+    ///     Err(SuperError { side: SuperErrorSideKick })
+    /// }
+    ///
+    /// fn main() {
+    ///     match get_super_error() {
+    ///         Err(e) => {
+    ///             println!("Error: {}", e.description());
+    ///             println!("Caused by: {}", e.source().unwrap());
+    ///         }
+    ///         _ => println!("No error"),
+    ///     }
+    /// }
+    /// ```
+    #[stable(feature = "rust1", since = "1.30.0")]
+    fn source(&self) -> Option<&(dyn Error + 'static)> { None }
 
     /// Get the `TypeId` of `self`
     #[doc(hidden)]