sub walk_and_do { my $self = shift; $_->walk_and_do for @{$self->children}; $self->do_my_stuff; # could throw an exception. } eval { $root->walk_and_do; };