Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: About zsh-users 8489 (exception handling)
- X-seq: zsh-users 9452
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: Zsh Users <zsh-users@xxxxxxxxxx>
- Subject: Re: About zsh-users 8489 (exception handling)
- Date: Wed, 28 Sep 2005 02:42:49 +0000
- In-reply-to: <20050927234726.GC988@DervishD>
- Mailing-list: contact zsh-users-help@xxxxxxxxxx; run by ezmlm
- References: <20050927234726.GC988@DervishD>
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