I think that you can take advantage of the fact that the error messages all look like "Error 300: Couldn't foo the bar." The code below should work unless the string returned by GetAttribute happens to be formatted to look like an error message.
use Exception::Class (
'Image::Magick::Exception' => { fields => [ 'type', 'errno', 'msg' ]
+ }
);
...
my $result = &{"hidden::$cmethod"};
if( "$result" =~ /^(\w+)\s(\d\d\d):\s(.*)/ ) {
Image::Magick::Exception->throw(
error => "$result", type => $1, errno => $2, msg => $3
);
};
return $result
More generally, it looks like the really proper fix to this would involve twiddling the glue code in Magick.xs. I took a look at the code and I think a global flag could be added that changed the behavior of MagickErrorHandler and MagickWarningHandler, equivalent to DBI's RaiseError flag, but I don't have enough XS experience to know the right way to implement this.