Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: About zsh-users 8489 (exception handling)



On Sep 28,  1:47am, DervishD wrote:
:
:     In zsh-users 8489 Bart Schaeffer proposes using this syntax:
: 
:     { ${:?THROW} } 2>/dev/null
: 
:     Unfortunately, that doesn't work because ${:?...} *exits* from
: the shell

Not in an interactive shell, it doesn't.  However ...

: Is there any other way of generating an error (the exception) without
: using a subshell and without using current invalid syntax that could
: become valid in the future?

Yes.  If you declare (at the top of the throw function)

    readonly THROW

then

    THROW= 2>/dev/null

causes the error, which can be caught with "always".  You don't even
need the extra layer of { }.  I like this a lot, because it uses only
valid syntax that is pretty much guaranteed always to remain valid.

I think EXCEPTION should also be declared with "typeset -g", so that
makes the complete function look like:

throw() {
  typeset -g EXCEPTION="$1"
  readonly THROW
  if (( TRY_BLOCK_ERROR == 0 )); then
    # We are throwing an exception from the middle of an always-block.
    # We can do this by restoring the error status from the try-block.
    # (I am not convinced I ever intended this to work, but it does...)
    (( TRY_BLOCK_ERROR = 1 ))
  fi
  # Raise an error, but don't show an error message.
  # This is a bit of a hack.  (Surprised?)
  THROW= 2>/dev/null
}



Messages sorted by: Reverse Date, Date, Thread, Author