Functions are provided in the Python::Err:: namespace to classify python exceptions. These can be used to test $@ directly. E.g.:
eval { ... py_func(); ... }; if (Python::Err::IndexError($@)) { # handle it ... } elsif ($@) { die; # propagate }