package ClassB; sub method_y { if($something_has_gone_wrong) { confess("Something has gone wrong!"); } } package ClassA; sub method_x { try { $class_b_object->method_y; } catch { confess($_); } } package main; try { $class_a_object->method_x } catch { $log->error($_); } #### package Error; sub new { my($self, $class, $parameter) if(ref($parameter) eq 'Error') { return($parameter); } else { bless($self, $class); $self->stacktrace(Devel::StackTrace->new->as_string); $self->message($parameter); $self->timestamp(time); $self->whatever("Blah-blah"); return($self); } } package ClassB; sub method_y { if($something_has_gone_wrong) { die(Error->new("Something has gone wrong")); } } package ClassA; sub method_x { try { $class_b_object->method_y } catch { die(Error->new($_)); } } package main; try { $class_a_object->method_x; } catch { if(ref($_) eq Error) { print(SOMEWHERE "The worst has happened at " . $_->timestamp . "\n"); print(SOMEWHERE $_->message . "\n"); print(SOMEWHERE $_->backtrace . "\n"); } else { $log->error($_); } }