Exception handling in shell scripting?

BashShellException Handling

Bash Problem Overview


I'm looking for exception handling mechanism in shell script. Is there any try,catch equivalent mechanism in shell script ?

Bash Solutions


Solution 1 - Bash

There is not really a try/catch in bash (i assume you're using bash), but you can achieve a quite similar behaviour using && or ||.

In this example, you want to run fallback_command if a_command fails (returns a non-zero value):

a_command || fallback_command

And in this example, you want to execute second_command if a_command is successful (returns 0):

a_command && second_command

They can easily be mixed together by using a subshell, for example, the following command will execute a_command, if it succeeds it will then run other_command, but if a_command or other_command fails, fallback_command will be executed:

(a_command && other_command) || fallback_command

Solution 2 - Bash

The if/else structure and exit codes can help you fake some of it. This should work in Bash or Bourne (sh).

if foo ; then
else
  e=$?        # return code from if
  if [ "${e}" -eq "1"]; then
    echo "Foo returned exit code 1"
  elif [ "${e}" -gt "1"]; then
    echo "Foo returned BAD exit code ${e}"
  fi
fi

Solution 3 - Bash

{
    # command which may fail and give an error 
} || {
   # command which should be run instead of the above failing      command
}

Solution 4 - Bash

Here are two simple bashfunctions which enable eventhandling in bash:

You could use it for basic exceptionhandling like this:

onFoo(){
  echo "onFoo() called width arg $1!"
}  

foo(){
  [[ -f /tmp/somefile ]] || throw EXCEPTION_FOO_OCCURED "some arg"
} 

addListener EXCEPTION_FOO_OCCURED onFoo

Exceptionhandling using try/catch blocks is not supported in bash, however, you might wanna try looking at the BANGSH framework which supports it (its a bit like jquery for bash).

However, exceptionhandling without cascading try/catch-blocks is similar to eventhandling, which is possible in almost any language with array-support.

If you want to keep your code nice and tidy (without if/else verbosity), I would recommend to use events.

The suggestion which MatToufoutu recommends (using || and &&) is not recommended for functions, but ok for simple commands. (see BashPitfalls about the risks)

Solution 5 - Bash

Use following to handle error properly where error_exit is function that accepts one argument. In case if argument is not passed then it will throw unknown error with LineNo where actually error is happening. Please experiment before actually uses for production -

#!/bin/bash

PROGNAME=$(basename $0)

error_exit()

{

	echo "${PROGNAME}: ${1:-"Unknown Error"}" 1>&2
	exit 1
}

echo "Example of error with line number and message"
error_exit "$LINENO: An error has occurred."

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMandar PandeView Question on Stackoverflow
Solution 1 - BashmdeousView Answer on Stackoverflow
Solution 2 - BashbrightlancerView Answer on Stackoverflow
Solution 3 - BashPrasad KudalkarView Answer on Stackoverflow
Solution 4 - BashcoderofsalvationView Answer on Stackoverflow
Solution 5 - BashAbhishek JainView Answer on Stackoverflow