in reply to Re^4: exiting a subroutine neatly (Throwable)
in thread exiting a subroutine neatly

But then, you are using exceptions for flow control when what you really need is some kind of unwind-protect. For instance Guard.

How do you figure?

I raise an exception in case of error -- this isn't using exceptions for flow control, exceptions aren't used to return a value from the sub

so I included both ret and err in the exception -- this isn't using exceptions for flow control ... I simply didn't scrutinize the if statement beyond counting/naming the vars which I included in the exception

  • Comment on Re^5: exiting a subroutine neatly (Throwable)

Replies are listed 'Best First'.
Re^6: exiting a subroutine neatly (Throwable)
by salva (Canon) on May 05, 2015 at 11:28 UTC
    How do you figure?

    Looking at your code:

    sub foo { ... try { fooFoo($ssh); } catch { warn "warn cought one: $_"; }; $ssh->exit_session; $ssh->close_session; }

    What I mean is that you should let your exceptions go uncaught for upper levels where they can be handled properly. There is no reason to couple the exception catching with the cleanup code.

      What I mean is that you should let your exceptions go uncouth for upper levels where they can be handled properly. There is no reason to couple the exception catching with the cleanup code.

      Oh that, yes, I assume foo is the topmost level

      If it isn't, rethrow

      my $exception = try { ... } || { $$_; }; $ssh->exit_session; $ssh->close_session; $exception and $exception->throw;

      Rethrow versus Guard? Eeeh :)