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/catch | |
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/catch')
-rw-r--r-- | Functions/Exceptions/catch | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/Functions/Exceptions/catch b/Functions/Exceptions/catch new file mode 100644 index 000000000..5f3876228 --- /dev/null +++ b/Functions/Exceptions/catch @@ -0,0 +1,41 @@ +# Catch an exception. Returns 0 if the exception in question was caught. +# The first argument gives the exception to catch, which may be a +# pattern. +# This must be within an always-block. A typical set of handlers looks +# like: +# { +# # try block; something here throws exceptions +# } always { +# if catch MyExcept; then +# # Handler code goes here. +# print Handling exception MyExcept +# elif catch *; then +# # This is the way to implement a catch-all. +# print Handling any other exception +# fi +# } +# As with other languages, exceptions do not need to be handled +# within an always block and may propagate to a handler further up the +# call chain. +# +# It is possible to throw an exception from within the handler by +# using "throw". +# +# The shell variable $CAUGHT is set to the last exception caught, +# which is useful if the argument to "catch" was a pattern. +# +# Use "function" keyword in case catch is already an alias. +function catch { + if [[ $TRY_BLOCK_ERROR -gt 0 && $EXCEPTION = ${~1} ]]; then + (( TRY_BLOCK_ERROR = 0 )) + CAUGHT="$EXCEPTION" + unset EXCEPTION + return 0 + fi + + return 1 +} +# Never use globbing with "catch". +alias catch="noglob catch" + +catch "$@" |