sub find { my ($self, $search_item) = @_; eval { # skip expensive search if item not stored anywhere throw Signal::Search::Not_Stored unless $search_item->stored; # otherwise do expensive search $self->first; while (my $item = $self->next) { throw Signal::Search::Found if $item == $search_item; }; throw Signal::Search::Not_Found; }; if ($@) { my $e = $@; # Do NOT handle Signals here. Those propagate back # up to the caller who will handle them appropriately. throw $e if $e->isa('Signal::Search'); ... handle exceptions here ... }; };