diff --git a/newsfragments/3062.fixed.md b/newsfragments/3062.fixed.md new file mode 100644 index 00000000000..9738978f7b4 --- /dev/null +++ b/newsfragments/3062.fixed.md @@ -0,0 +1 @@ +Stop panic on `fmt::Display`, instead return `""` string and report error via `sys.unraisablehook()` diff --git a/src/types/mod.rs b/src/types/mod.rs index 8d3e2714383..235093dfa93 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -99,8 +99,15 @@ macro_rules! pyobject_native_type_base( fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::result::Result<(), ::std::fmt::Error> { - let s = self.str().or(::std::result::Result::Err(::std::fmt::Error))?; - f.write_str(&s.to_string_lossy()) + match self.str() { + ::std::result::Result::Ok(s) => return f.write_str(&s.to_string_lossy()), + ::std::result::Result::Err(err) => err.write_unraisable(self.py(), ::std::option::Option::Some(self)), + } + + match self.get_type().name() { + ::std::result::Result::Ok(name) => ::std::write!(f, "", name), + ::std::result::Result::Err(_err) => f.write_str(""), + } } }