Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Preserve panic message after exception is normalized
Browse files Browse the repository at this point in the history
davidhewitt committed Jul 18, 2023
1 parent 3125b90 commit 173dc9d
Showing 2 changed files with 21 additions and 1 deletion.
1 change: 1 addition & 0 deletions newsfragments/3306.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix loss of panic message in `PanicException` when unwinding after the exception was "normalized".
21 changes: 20 additions & 1 deletion src/err/mod.rs
Original file line number Diff line number Diff line change
@@ -303,7 +303,7 @@ impl PyErr {
if ptype.as_ptr() == PanicException::type_object_raw(py).cast() {
let msg: String = pvalue
.as_ref()
.and_then(|obj| obj.extract(py).ok())
.map(|obj| obj.as_ref(py).to_string())
.unwrap_or_else(|| String::from("Unwrapped panic from Python code"));

eprintln!(
@@ -863,6 +863,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):

0 comments on commit 173dc9d

Please sign in to comment.