Fish Shell:
Handling errors

How to:

To catch errors in Fish, lean on the status command and conditionals. Say ping fails; here’s how to detect that:

ping -c 1 example.com
if not status is-success
    echo "Something fishy happened with the ping."
end

Sample output if ping fails:

Something fishy happened with the ping.

To handle a specific error code, use status --is:

false
if status --is 1
    echo "Caught an error with code 1."
end

Sample output:

Caught an error with code 1.

For a more robust approach, consider using a function:

function try_ping
    ping -c 1 example.com
    or begin
        echo "Ping failed with status $status"
        return 1
    end
end

try_ping

Deep Dive

Error handling in Fish doesn’t match the try/catch paradigm you might know from higher-level languages. Instead, you have straightforward exit statuses provided by the status command.

Historically, in Unix-like systems, an exit status of 0 means success, while any non-zero value indicates an error, which commonly reflects different failure reasons. This convention is employed by most command-line utilities and hence, by Fish itself.

Alternatives to status checks in Fish include signal handling via trap in other shells, but Fish prefers more explicit status checking, because it’s cleaner and less prone to side effects.

Implementation-wise, error handling in Fish remains simple yet powerful, largely due to its non-blocking nature and emphasis on clear syntax, as shown in the examples. Error codes blend nicely with functions, allowing for modular and readable error management.

See Also