diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2005-02-15 18:31:41 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2005-02-15 18:31:41 +0000 |
commit | 20018230ee7c7b982baa3d28b7684a49a116cf8a (patch) | |
tree | e6c06ff484ef3f5c05982ac6c698f0ac0db02643 /Functions/Exceptions/throw | |
parent | 4040e0bb1f7d970fa5999cab838d5453a7f731a9 (diff) | |
download | zsh-20018230ee7c7b982baa3d28b7684a49a116cf8a.tar.gz zsh-20018230ee7c7b982baa3d28b7684a49a116cf8a.tar.xz zsh-20018230ee7c7b982baa3d28b7684a49a116cf8a.zip |
20812: Add functions for exception handling
Diffstat (limited to 'Functions/Exceptions/throw')
-rw-r--r-- | Functions/Exceptions/throw | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/Functions/Exceptions/throw b/Functions/Exceptions/throw new file mode 100644 index 000000000..a5478fb9c --- /dev/null +++ b/Functions/Exceptions/throw @@ -0,0 +1,29 @@ +# Throw an exception. +# The first argument is a string giving the exception. Other arguments +# are ignored. +# +# This is designed to be called somewhere inside a "try-block", i.e. +# some code of the form: +# { +# # try-block +# } always { +# # always-block +# } +# although as normal with exceptions it might be hidden deep inside +# other code. Note, however, that it must be code running within the +# current shell; with shells, unlike other languages, it is quite easy +# to miss points at which the shell forks. +# +# If there is nothing to catch an exception, this behaves like any +# other shell error, aborting to the command prompt or abandoning a +# script. + +# The following must not be local. +EXCEPTION="$1" +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. + (( TRY_BLOCK_ERROR = 1 )) +fi +# Raise an error, but don't show an error message. +{ ${:?THROW} } 2>/dev/null |