use core::array;
-use crate::alloc::{AllocErr, LayoutErr, CannotReallocInPlace};
+use crate::alloc::{AllocErr, CannotReallocInPlace, LayoutErr};
use crate::any::TypeId;
use crate::backtrace::Backtrace;
use crate::borrow::Cow;
/// [`source`]: trait.Error.html#method.source
#[stable(feature = "rust1", since = "1.0.0")]
pub trait Error: Debug + Display {
- /// **This method is soft-deprecated.**
- ///
- /// Although using it won’t cause compilation warning,
- /// new code should use [`Display`] instead
- /// and new `impl`s can omit it.
- ///
- /// To obtain error description as a string, use `to_string()`.
- ///
- /// [`Display`]: ../fmt/trait.Display.html
- ///
- /// # Examples
- ///
- /// ```
- /// match "xc".parse::<u32>() {
- /// Err(e) => {
- /// // Print `e` itself, not `e.description()`.
- /// println!("Error: {}", e);
- /// }
- /// _ => println!("No error"),
- /// }
- /// ```
- #[stable(feature = "rust1", since = "1.0.0")]
- fn description(&self) -> &str {
- "description() is deprecated; use Display"
- }
-
- /// The lower-level cause 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 cause(&self) -> Option<&dyn Error> {
- /// 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.cause().unwrap());
- /// }
- /// _ => println!("No error"),
- /// }
- /// }
- /// ```
- #[stable(feature = "rust1", since = "1.0.0")]
- #[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
/// }
///
/// impl Error for SuperError {
- /// fn description(&self) -> &str {
- /// "I'm the superhero of errors"
- /// }
- ///
/// fn source(&self) -> Option<&(dyn Error + 'static)> {
/// Some(&self.side)
/// }
/// }
/// }
///
- /// impl Error for SuperErrorSideKick {
- /// fn description(&self) -> &str {
- /// "I'm SuperError side kick"
- /// }
- /// }
+ /// impl Error for SuperErrorSideKick {}
///
/// fn get_super_error() -> Result<(), SuperError> {
/// Err(SuperError { side: SuperErrorSideKick })
/// }
/// ```
#[stable(feature = "error_source", since = "1.30.0")]
- fn source(&self) -> Option<&(dyn Error + 'static)> { None }
+ fn source(&self) -> Option<&(dyn Error + 'static)> {
+ None
+ }
/// Gets the `TypeId` of `self`.
#[doc(hidden)]
- #[unstable(feature = "error_type_id",
- reason = "this is memory-unsafe to override in user code",
- issue = "60784")]
- fn type_id(&self, _: private::Internal) -> TypeId where Self: 'static {
+ #[unstable(
+ feature = "error_type_id",
+ reason = "this is memory-unsafe to override in user code",
+ issue = "60784"
+ )]
+ fn type_id(&self, _: private::Internal) -> TypeId
+ where
+ Self: 'static,
+ {
TypeId::of::<Self>()
}
fn backtrace(&self) -> Option<&Backtrace> {
None
}
+
+ /// ```
+ /// if let Err(e) = "xc".parse::<u32>() {
+ /// // Print `e` itself, no need for description().
+ /// eprintln!("Error: {}", e);
+ /// }
+ /// ```
+ #[stable(feature = "rust1", since = "1.0.0")]
+ #[rustc_deprecated(since = "1.41.0", reason = "use the Display impl or to_string()")]
+ fn description(&self) -> &str {
+ "description() is deprecated; use Display"
+ }
+
+ #[stable(feature = "rust1", since = "1.0.0")]
+ #[rustc_deprecated(
+ since = "1.33.0",
+ reason = "replaced by Error::source, which can support downcasting"
+ )]
+ #[allow(missing_docs)]
+ fn cause(&self) -> Option<&dyn Error> {
+ self.source()
+ }
}
mod private {
/// }
/// }
///
- /// impl Error for AnError {
- /// fn description(&self) -> &str {
- /// "Description of an error"
- /// }
- /// }
+ /// impl Error for AnError {}
///
/// let an_error = AnError;
/// assert!(0 == mem::size_of_val(&an_error));
/// }
/// }
///
- /// impl Error for AnError {
- /// fn description(&self) -> &str {
- /// "Description of an error"
- /// }
- /// }
+ /// impl Error for AnError {}
///
/// unsafe impl Send for AnError {}
///
/// assert!(
/// mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
/// ```
+ #[inline]
fn from(err: String) -> Box<dyn Error + Send + Sync> {
struct StringError(String);
impl Error for StringError {
- fn description(&self) -> &str { &self.0 }
+ #[allow(deprecated)]
+ fn description(&self) -> &str {
+ &self.0
+ }
}
impl Display for StringError {
/// assert!(
/// mem::size_of::<Box<dyn Error + Send + Sync>>() == mem::size_of_val(&a_boxed_error))
/// ```
+ #[inline]
fn from(err: &str) -> Box<dyn Error + Send + Sync + 'a> {
From::from(String::from(err))
}
}
#[unstable(feature = "never_type", issue = "35121")]
-impl Error for ! {
- fn description(&self) -> &str { *self }
-}
-
-#[unstable(feature = "allocator_api",
- reason = "the precise API and guarantees it provides may be tweaked.",
- issue = "32838")]
-impl Error for AllocErr {
- fn description(&self) -> &str {
- "memory allocation failed"
- }
-}
-
-#[unstable(feature = "allocator_api",
- reason = "the precise API and guarantees it provides may be tweaked.",
- issue = "32838")]
-impl Error for LayoutErr {
- fn description(&self) -> &str {
- "invalid parameters to Layout::from_size_align"
- }
-}
-
-#[unstable(feature = "allocator_api",
- reason = "the precise API and guarantees it provides may be tweaked.",
- issue = "32838")]
-impl Error for CannotReallocInPlace {
- fn description(&self) -> &str {
- CannotReallocInPlace::description(self)
- }
-}
+impl Error for ! {}
+
+#[unstable(
+ feature = "allocator_api",
+ reason = "the precise API and guarantees it provides may be tweaked.",
+ issue = "32838"
+)]
+impl Error for AllocErr {}
+
+#[unstable(
+ feature = "allocator_api",
+ reason = "the precise API and guarantees it provides may be tweaked.",
+ issue = "32838"
+)]
+impl Error for LayoutErr {}
+
+#[unstable(
+ feature = "allocator_api",
+ reason = "the precise API and guarantees it provides may be tweaked.",
+ issue = "32838"
+)]
+impl Error for CannotReallocInPlace {}
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for str::ParseBoolError {
- fn description(&self) -> &str { "failed to parse bool" }
+ #[allow(deprecated)]
+ fn description(&self) -> &str {
+ "failed to parse bool"
+ }
}
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for str::Utf8Error {
+ #[allow(deprecated)]
fn description(&self) -> &str {
"invalid utf-8: corrupt contents"
}
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for num::ParseIntError {
+ #[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
#[stable(feature = "try_from", since = "1.34.0")]
impl Error for num::TryFromIntError {
+ #[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
#[stable(feature = "try_from", since = "1.34.0")]
impl Error for array::TryFromSliceError {
+ #[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for num::ParseFloatError {
+ #[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for string::FromUtf8Error {
+ #[allow(deprecated)]
fn description(&self) -> &str {
"invalid utf-8"
}
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for string::FromUtf16Error {
+ #[allow(deprecated)]
fn description(&self) -> &str {
"invalid utf-16"
}
#[stable(feature = "decode_utf16", since = "1.9.0")]
impl Error for char::DecodeUtf16Error {
+ #[allow(deprecated)]
fn description(&self) -> &str {
"unpaired surrogate found"
}
#[stable(feature = "box_error", since = "1.8.0")]
impl<T: Error> Error for Box<T> {
+ #[allow(deprecated, deprecated_in_future)]
fn description(&self) -> &str {
Error::description(&**self)
}
#[stable(feature = "fmt_error", since = "1.11.0")]
impl Error for fmt::Error {
+ #[allow(deprecated)]
fn description(&self) -> &str {
"an error occurred when formatting an argument"
}
#[stable(feature = "try_borrow", since = "1.13.0")]
impl Error for cell::BorrowError {
+ #[allow(deprecated)]
fn description(&self) -> &str {
"already mutably borrowed"
}
#[stable(feature = "try_borrow", since = "1.13.0")]
impl Error for cell::BorrowMutError {
+ #[allow(deprecated)]
fn description(&self) -> &str {
"already borrowed"
}
#[stable(feature = "try_from", since = "1.34.0")]
impl Error for char::CharTryFromError {
+ #[allow(deprecated)]
fn description(&self) -> &str {
"converted integer out of range for `char`"
}
#[stable(feature = "char_from_str", since = "1.20.0")]
impl Error for char::ParseCharError {
+ #[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
#[inline]
pub fn downcast_ref<T: Error + 'static>(&self) -> Option<&T> {
if self.is::<T>() {
- unsafe {
- Some(&*(self as *const dyn Error as *const T))
- }
+ unsafe { Some(&*(self as *const dyn Error as *const T)) }
} else {
None
}
#[inline]
pub fn downcast_mut<T: Error + 'static>(&mut self) -> Option<&mut T> {
if self.is::<T>() {
- unsafe {
- Some(&mut *(self as *mut dyn Error as *mut T))
- }
+ unsafe { Some(&mut *(self as *mut dyn Error as *mut T)) }
} else {
None
}
#[unstable(feature = "error_iter", issue = "58520")]
#[inline]
pub fn chain(&self) -> Chain<'_> {
- Chain {
- current: Some(self),
- }
+ Chain { current: Some(self) }
}
}
#[inline]
#[stable(feature = "error_downcast", since = "1.3.0")]
/// Attempts to downcast the box to a concrete type.
- pub fn downcast<T: Error + 'static>(self: Box<Self>)
- -> Result<Box<T>, Box<dyn Error + Send>> {
+ pub fn downcast<T: Error + 'static>(self: Box<Self>) -> Result<Box<T>, Box<dyn Error + Send>> {
let err: Box<dyn Error> = self;
<dyn Error>::downcast(err).map_err(|s| unsafe {
// Reapply the `Send` marker.
#[inline]
#[stable(feature = "error_downcast", since = "1.3.0")]
/// Attempts to downcast the box to a concrete type.
- pub fn downcast<T: Error + 'static>(self: Box<Self>)
- -> Result<Box<T>, Box<Self>> {
+ pub fn downcast<T: Error + 'static>(self: Box<Self>) -> Result<Box<T>, Box<Self>> {
let err: Box<dyn Error> = self;
<dyn Error>::downcast(err).map_err(|s| unsafe {
// Reapply the `Send + Sync` marker.
}
}
- impl Error for A {
- fn description(&self) -> &str { "A-desc" }
- }
- impl Error for B {
- fn description(&self) -> &str { "A-desc" }
- }
+ impl Error for A {}
+ impl Error for B {}
#[test]
fn downcasting() {