about summary refs log tree commit diff
path: root/Functions/Exceptions/catch
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2005-02-15 18:31:41 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2005-02-15 18:31:41 +0000
commit20018230ee7c7b982baa3d28b7684a49a116cf8a (patch)
treee6c06ff484ef3f5c05982ac6c698f0ac0db02643 /Functions/Exceptions/catch
parent4040e0bb1f7d970fa5999cab838d5453a7f731a9 (diff)
downloadzsh-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/catch41
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 "$@"