Skip to content

Commit

Permalink
Merge pull request #3326 from davidhewitt/fix-err-panic-normalize
Browse files Browse the repository at this point in the history
Preserve panic message after exception is normalized
  • Loading branch information
adamreichold committed Jul 19, 2023
2 parents 421e13a + 2e2dde9 commit 7958f03
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
1 change: 1 addition & 0 deletions newsfragments/3326.fixed.md
@@ -0,0 +1 @@
Fix loss of panic message in `PanicException` when unwinding after the exception was "normalized".
24 changes: 22 additions & 2 deletions src/err/mod.rs
Expand Up @@ -297,9 +297,10 @@ impl PyErr {
};

if ptype.as_ptr() == PanicException::type_object_raw(py).cast() {
let msg: String = pvalue
let msg = pvalue
.as_ref()
.and_then(|obj| obj.extract(py).ok())
.and_then(|obj| obj.as_ref(py).str().ok())
.map(|py_str| py_str.to_string_lossy().into())
.unwrap_or_else(|| String::from("Unwrapped panic from Python code"));

eprintln!(
Expand Down Expand Up @@ -845,6 +846,25 @@ mod tests {
});
}

#[test]
#[should_panic(expected = "new panic")]
#[cfg(not(Py_3_12))]
fn fetching_normalized_panic_exception_resumes_unwind() {
use crate::panic::PanicException;

Python::with_gil(|py| {
let err: PyErr = PanicException::new_err("new panic");
// Restoring an error doesn't normalize it before Python 3.12,
// so we have to explicitly test this case.
let _ = err.normalized(py);
err.restore(py);
assert!(PyErr::occurred(py));

// should resume unwind
let _ = PyErr::fetch(py);
});
}

#[test]
fn err_debug() {
// Debug representation should be like the following (without the newlines):
Expand Down

0 comments on commit 7958f03

Please sign in to comment.